x_message => messagebox(,'modal')
[scilab.git] / scilab / modules / scicos_blocks / macros / Misc / MBLOCK.sci
1 //  Scicos
2 //
3 //  Copyright (C) INRIA - METALAU Project <scicos@inria.fr>
4 //
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; either version 2 of the License, or
8 // (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 //
19 // See the file ../license.txt
20 //
21
22 function [x,y,typ]=MBLOCK(job,arg1,arg2)
23 x=[];y=[];typ=[];
24 select job
25 case 'plot' then
26   standard_draw(arg1)
27 case 'getinputs' then
28   [x,y,typ]=standard_inputs(arg1)
29 case 'getoutputs' then
30   [x,y,typ]=standard_outputs(arg1)
31 case 'getorigin' then
32   [x,y]=standard_origin(arg1)
33 case 'set' then
34  x=arg1
35  model=arg1.model
36  graphics=arg1.graphics
37  //label=graphics.exprs;
38  exprs=graphics.exprs
39
40  //Compatibility
41  if type(exprs)==15 then
42   paramv=list();
43   pprop=[];
44   //must do something better than that !
45   for i=1:size(model.rpar,'*')
46      paramv($+1)=string(model.rpar(i))
47      pprop($+1) = 0
48   end
49
50   exprs = tlist(["MBLOCK","in","intype","out","outtype",...
51                  "param","paramv","pprop","nameF","funtxt"],...
52                  exprs(1)(1),..
53                  exprs(1)(2),..
54                  exprs(1)(3),..
55                  exprs(1)(4),..
56                  exprs(1)(5),..
57                  paramv,...
58                  sci2exp(pprop(:)),..
59                  exprs(1)(7),exprs(2))
60
61  end
62
63  //lab_1 = [in,intype,out,outtype,param,nameF]
64  lab_1 = list(exprs.in,..       //1
65               exprs.intype,..   //2
66               exprs.out,..      //3
67               exprs.outtype,..  //4
68               exprs.param,..    //5
69               exprs.pprop,..    //6
70               exprs.nameF)      //7
71
72  //lab_2 = [paramv]
73  lab_2 = exprs.paramv //already a list
74
75  //store exprs before modif
76  //exprs.prev_exprs=exprs;
77  //exprs.prev_exprs.prev_exprs=tlist("MBLOCK");
78
79  while %t do
80 //     [ok,Tin,Tintype,Tout,Touttype,Tparam,Tparamv,Tfunam,lab]=..
81 //         getvalue('Set Modelica generic block parameters',..
82 //         ['Input variables:       ';..
83 //          'Input variables types: ';..
84 //          'Output variables:      ';..
85 //          'Output variables types:';..
86 //          'Parameters in Modelica:';..
87 //          'Parameter  values:     ';..
88 //          'Function name:         '],..
89 //         list('str',-1,'str',-1,'str',-1,'str',-1,'str',-1,'str',-1,'str',-1),label(1))
90
91    //warning here lab_1 is a list
92    [ok,Tin,Tintype,Tout,Touttype,Tparam,pprop,Tfunam,lab_1]=..
93        getvalue('Set Modelica generic block parameters',..
94        ['Input variables:       ';..
95         'Input variables types: ';..
96         'Output variables:      ';..
97         'Output variables types:';..
98         'Parameters in Modelica:';..
99         'Parameters properties: ';..
100         'Function name:         '],..
101         list('str',-1,'str',-1,'str',-1,'str',-1,'str',-1,..
102              'vec',-1,'str',-1),lab_1)
103
104    //Cancel case
105    if ~ok then
106      break
107    end
108 //   ierr=execstr("in=stripblanks(evstr(Tin));..
109 //   intype=stripblanks(evstr(Tintype));..
110 //   out=stripblanks(evstr(Tout));..
111 //   outtype=stripblanks(evstr(Touttype));..
112 //   param=stripblanks(evstr(Tparam));..
113 //   paramv=evstr(Tparamv);..
114 //   funam=stripblanks(Tfunam)",'errcatch')
115 //
116    //first stage of checking variable name
117    //put string symbolic parameters in variable
118    ierr=execstr("in=stripblanks(evstr(Tin));..
119                  intype=stripblanks(evstr(Tintype));..
120                  out=stripblanks(evstr(Tout));..
121                  outtype=stripblanks(evstr(Touttype));..
122                  param=stripblanks(evstr(Tparam));..
123                  funam=stripblanks(Tfunam)",'errcatch')
124
125    if ierr<>0 then
126      //You loose ! Try again ! Insert coin !
127      //messagebox("Error, try again please!","modal","error");
128      messagebox("Error in evaluation of variables.","modal","error");
129      ok=%f
130      //break
131    end
132
133    //check for valid name variable
134    //in
135    if ok then
136      for i=1:size(in,'*')
137        r=%f;
138        ierr=execstr('r=validvar(in(i))','errcatch')
139        if ~r then
140          ok=%f
141          break
142        end
143      end
144      if ~ok then
145        messagebox(["Invalid variable name for the input "+string(i)+".";
146                   """"+in(i)+"""";
147                   "Please choose another variable name."],"modal","error");
148      end
149    end
150    //out
151    if ok then
152      for i=1:size(out,'*')
153        r=%f;
154        ierr=execstr('r=validvar(out(i))','errcatch')
155        if ~r then
156          ok=%f
157          break
158        end
159      end
160      if ~ok then
161        messagebox(["Invalid variable name for the output "+string(i)+".";
162                   """"+out(i)+"""";
163                   "Please choose another variable name."],"modal","error");
164      end
165    end
166    //param
167    if ok then
168      param=param(:)
169      for i=1:size(param,'*')
170        r=%f;
171        ierr=execstr('r=validvar(param(i))','errcatch')
172        if ~r then
173          ok=%f
174          break
175        end
176      end
177      if ~ok then
178        messagebox(["Invalid variable name for the parameter "+string(i)+".";
179                   """"+param(i)+"""";
180                   "Please choose another variable name."],"modal","error");
181      end
182    end
183
184    // type checking
185    //typeok=%t;
186    if ok then
187      for i=1:size(intype,'*')
188        if intype(i)<>'E'&intype(i)<>'I' then
189          //typeok=%f;
190          messagebox("Input type should be ''E'' or ''I''!","modal","error");
191          ok=%f
192          break
193        end
194      end
195    end
196 //    if ~typeok then
197 //      ok=%f
198 //      //break
199 //    end
200
201    if ok then
202      for i=1:size(outtype,'*')
203        if outtype(i)<>'E'&outtype(i)<>'I' then
204          //typeok=%f;
205          messagebox("Output type should be ''E'' or ''I''!","modal","error");
206          ok=%f
207          break
208        end
209      end
210    end
211 //   if ~typeok then break, end
212
213    //cross size checking
214    if ok then
215      if or(size(intype)<>size(in)) then
216        messagebox("Input variables are not well defined!","modal","error");
217        ok=%f
218        //break;
219      end
220    end
221
222    if ok then
223      if or(size(outtype)<>size(out)) then
224        messagebox("Output variables are not well defined!","modal","error");
225        ok=%f
226        //break;
227      end
228    end
229
230    //check param properties
231    if ok then
232      pprop = pprop(:)
233      if (size(param,'*')<>size(pprop,'*')) then
234        messagebox(["There is differences in";
235                   "size of param and size ";
236                   "of param properties."],"modal","error");
237        ok=%f
238        //break;
239      end
240    end
241
242    if ok then
243      if max(pprop)>2 | min(pprop)<0 then
244        messagebox(["Parameters properties must be :";
245                   "0 : for simple paramater,";
246                   "1 : for initial state value,";
247                   "2 : for a fixed initial state value."],"modal","error");
248        ok=%f
249        //break;
250      end
251    end
252
253    //check name of modelica file
254    if ok then
255      if funam=='' then
256        messagebox("The filename is not defined!","modal","error");
257        ok=%f
258        //break
259      end
260    end
261
262    if ok then
263      [dirF,nameF,extF]=fileparts(funam);
264      if (extF<>'' & extF<>'.mo')|(dirF<>'' & extF<>'.mo') then
265        messagebox("Filename extention should be ''.mo '' !","modal","error");
266        ok=%f
267        //break
268      end
269    end
270
271    if ok then
272      //set_io checking
273      intypex=find(intype=='I'); outtypex=find(outtype=='I');
274      //[model,graphics,ok]=check_io(model,graphics,ones(in),..
275      //                             ones(out),[],[],intypex,outtypex)
276      [model,graphics,ok]=set_io(model,graphics,list([ones(in),ones(in)],ones(in)),..
277                                                list([ones(out),ones(out)],ones(out)),..
278                                                [],[],intypex,outtypex)
279    end
280
281    //*****************************************************************************
282    //generate second dialog box from Tparam
283    if ok then
284
285      Tparam_lab=evstr(Tparam) //labels
286      Tparam_sz=size(Tparam_lab,'*') //numbers of labels
287
288      //adjust size of lab_2 according to size of Tparam
289      if Tparam_sz>lstsize(lab_2) then
290        for i=1:(Tparam_sz-lstsize(lab_2))
291          lab_2($+1)="0"
292        end
293      elseif Tparam_sz<lstsize(lab_2) then
294        lab_2_tmp=list()
295        if Tparam_sz<>0 then //if param
296          for i=1:(lstsize(lab_2)-Tparam_sz)
297            lab_2_tmp(i)=lab_2(i)
298          end
299        end
300        lab_2=lab_2_tmp
301      end
302
303      //generate lhs, label and rhs txt for getvalue
304      if Tparam_sz<>0 then //if param
305        lhs_txt="" //lhs txt
306        lab_txt="" //label txt
307        rhs_txt="" //rhs txt
308        for i=1:Tparam_sz
309          lhs_txt=lhs_txt+'%v'+string(i)+','
310          if pprop(i) == 0 then
311            lab_txt=lab_txt+''''+Tparam_lab(i)+''';'
312          elseif  pprop(i) == 1 then
313            lab_txt=lab_txt+''''+Tparam_lab(i)+' (state) '';'
314          elseif  pprop(i) == 2 then
315            lab_txt=lab_txt+''''+Tparam_lab(i)+' (fixed state) '';'
316          end
317          rhs_txt=rhs_txt+'''vec'',-1,'
318        end
319        lhs_txt=part(lhs_txt,1:length(lhs_txt)-1)
320        lab_txt=part(lab_txt,1:length(lab_txt)-1)
321        rhs_txt=part(rhs_txt,1:length(rhs_txt)-1)
322
323        //generate main getvalue cmd
324        //warning here lab_2 is a list in input and a string in output
325        getvalue_txt = '[ok,'+lhs_txt+',lab_2]=getvalue(''Set parameters values'',['+..
326                       lab_txt+'],'+..
327                       'list('+rhs_txt+'),lab_2)'
328
329        //display the second dialog box
330        execstr(getvalue_txt)
331
332        //restore original lab_2 if not ok
333        if ~ok then
334          lab_2 = exprs.paramv
335        end
336      end
337    end
338
339    //put output param in the form of a list
340    //in paramv
341    if ok then
342      paramv=list();
343      for i=1:Tparam_sz
344        execstr('paramv('+string(i)+')=%v'+string(i))
345      end
346    end
347    //*****************************************************************************
348
349    //============================---------MBLOCK2
350    if ok then
351      if extF=='.mo' & fileinfo(funam)<>[] then
352        tt=mgetl(funam)
353      else
354        tt=exprs.funtxt
355        mo=model.equations
356        //if model.sim(1)<>nameF then
357        if mo.model<>nameF then
358          tt=[]
359        end
360      end
361    //============================
362      [ok,tt]=MODCOM(funam,tt,in,out,param,paramv,pprop)
363      if ~ok then
364        break
365      end
366    end
367
368    if ok then
369      //------------------
370      mo=modelica()
371      mo.model=nameF
372      mo.inputs=in;
373      mo.outputs=out;
374      if max(pprop)>0 then
375        mo.parameters=list(param',paramv,pprop')
376      else
377        mo.parameters=list(param',paramv)
378      end
379      model.equations=mo
380      //------------------
381      //model.rpar=paramv;
382      model.rpar=[]
383      for i=1:lstsize(paramv)
384         model.rpar=[model.rpar;
385                     paramv(i)(:)]//value
386      end
387      model.sim(1)=funam
388      //------------------
389      exprs.in=lab_1(1)
390      exprs.intype=lab_1(2)
391      exprs.out=lab_1(3)
392      exprs.outtype=lab_1(4)
393      exprs.param=lab_1(5)
394      exprs.paramv=list();
395      if Tparam_sz<>0 then //if param
396        if type(lab_2)==15 then //for eval
397          for i=1:lstsize(lab_2)
398            exprs.paramv(i)=lab_2(i);//string
399          end
400        else
401          for i=1:size(lab_2,'*')
402            exprs.paramv(i)=lab_2(i);
403          end
404        end
405      end
406      exprs.pprop=lab_1(6)
407      exprs.nameF=lab_1(7)
408      exprs.funtxt=tt
409      //label(2)=tt
410      //------------------
411      x.model=model
412      graphics.gr_i(1)(1)='txt=[''Modelica'';'' ' + nameF + ' ''];'
413      graphics.in_implicit =intype
414      graphics.out_implicit=outtype
415      //graphics.exprs=label
416      graphics.exprs=exprs
417      x.graphics=graphics
418      break
419    end
420 end
421
422 //Define
423 case 'define' then
424   in=['u1']
425   intype=['I']
426   out=['y1';'y2']
427   outtype=['I';'E']
428   param=['R';'L'];
429   //paramv=[0.1;0.0001];
430   paramv=list(0.1,.0001)
431   pprop=[0;0];
432   nameF='generic'
433
434   //label=list([sci2exp(in),sci2exp(intype,sci2exp(out),..
435   //           sci2exp(outtype),sci2exp(param),sci2exp(paramv),nameF]',[])
436
437   exprs = tlist(["MBLOCK","in","intype","out","outtype",...
438                  "param","paramv","pprop","nameF","funtxt"],...
439                  sci2exp(in(:)),..
440                  sci2exp(intype(:)),..
441                  sci2exp(out(:)),..
442                  sci2exp(outtype(:)),..
443                  sci2exp(param(:)),..
444                  list(string(0.1),string(.0001)),...
445                  sci2exp(pprop(:)),..
446                  nameF,[])
447
448   model=scicos_model()
449   model.blocktype='c'
450   model.dep_ut=[%f %t]
451   //model.rpar=paramv;
452   model.rpar=[]
453   for i=1:lstsize(paramv)
454     model.rpar=[model.rpar;
455                 paramv(i)(:)]
456   end
457
458   mo=modelica()
459   mo.model=nameF
460   mo.parameters=list(param,paramv)
461   model.sim=list(mo.model,30004)
462   mo.inputs=in
463   mo.outputs=out
464   model.in=ones(size(mo.inputs,'r'),1)
465   model.out=ones(size(mo.outputs,'r'),1)
466   model.equations=mo
467   gr_i=['txt=[''Modelica'';'' '+nameF+' ''];';
468               'xstringb(orig(1),orig(2),txt,sz(1),sz(2),''fill'')']
469   //x=standard_define([3 2],model,label,gr_i)
470   x=standard_define([3 2],model,exprs,gr_i)
471   x.graphics.in_implicit =intype
472   x.graphics.out_implicit=outtype
473 end
474 endfunction
475