481e7eab6b328b87e59da0698ed15ab7c11353d2
[scilab.git] / scilab / modules / scicos / macros / scicos_scicos / do_addnew.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 [scs_m, fct] = do_addnew(scs_m)
23 //**   
24 //**
25 //** "fct" is a flag control variable used by the calling function Addnewblock
26 //**       it is used to signal modification of the datastructure
27 //**
28 //**---------- This part handle the file related functions and error handling --------------
29
30   fct = [] ;
31   [ok,name] = getvalue( 'Get block GUI function name', ['Name'],list('str',1),emptystr() )
32
33   if ~ok then return, end ; //** --> Exit point
34
35   name = stripblanks(name);
36
37   if name==emptystr() then
38       message("No block name specified");
39       return
40   end ; //** --> Exit point
41
42   to_get = %f ;
43
44   if exists(name)==0 then
45     to_get = %t ;
46   else
47     execstr('tp=type('+name+')')
48     to_get = tp<>11 & tp<>13 
49   end
50
51   if to_get then // try to get it
52
53     message(['Problem loading block '+name+'.';
54              'Use Activate_Scilab_Window and redefine it in Scilab.'] ) ;
55     return;
56
57     //path = name+'.sci'
58     //path = getfile("*.sci", path, title="File containing function: "+name)
59     //if length(path)<=0 then return,end
60     //[u,err]=file('open',path,'old','formatted')
61     //if err<>0 then
62     //  message(path+' file, Not found')
63     //  return
64     //end
65     //if execstr('getf(u)','errcatch')<>0 then
66     //  file('close',u)
67     //  message([name + " erroneous function:"; lasterror()])
68     //  return
69     //end
70     //file('close',u)
71     //if ~exists(name) then
72     //   message(name+" is not defined in this file")
73     //   return
74     //end
75     //fct = path
76
77   else
78
79     fct = emptystr()
80
81   end //**
82
83   //define the block
84   ierror = execstr('blk='+name+'(''define'')','errcatch')
85   if ierror <>0 & ierror <>4 then
86     message([ "Error in GUI function"; lasterror() ])
87     fct = [] ;
88     return
89   end
90
91   if ierror == 4 then
92     irr=message(['Error in GUI function--The error was:';
93                             lasterror();'It could be an old GUI';
94                       'Should I try to translate (no guarantee)?'],['yes','no'])
95
96     if irr==2 then
97
98       fct=[]
99       return
100
101     else
102       funcprot_val=funcprot()
103       funcprot(0)
104       standard_define=standard_define_old;
105       funcprot(funcprot_val)
106       ierror=execstr('blk='+name+'(''define'')','errcatch')
107
108       if ierror <>0 then
109                  message("Translation did not work, sorry")
110                  fct=[]
111                  return
112       end
113
114       do_version = do_version; //load do_version and its subfunctions
115
116       ierror = execstr('blk=up_to_date(blk)','errcatch');
117
118       if ierror <>0 then
119         message("Translation did not work, sorry")
120         fct=[]
121         return
122       end
123
124     end //** irr
125
126   end //** ierror
127
128   //**------ Al@n's update 2 ---------/////////////
129   // update blk !
130
131   if typeof(blk)=='Text' then
132     o_new = mlist(['Text','graphics','model','void','gui'],...
133                     scicos_graphics(),scicos_model(),' ','TEXT_f')
134   else
135     o_new=scicos_block();
136   end
137   T = getfield(1,blk);
138
139   for k=2:size(T,2)
140      select T(k)
141      //*********** graphics **********//
142      case 'graphics' then
143         ogra  = blk.graphics;
144         G     = getfield(1,ogra);
145         G_txt = [];
146         for l=2:size(G,2)
147           G_txt = G_txt + G(1,l) + ...
148                     "=" + "ogra." + G(1,l);
149           if l<>size(G,2) then
150               G_txt = G_txt + ',';
151           end
152         end
153         G_txt = 'ogra=scicos_graphics(' + G_txt + ')';
154         ierr  = execstr(G_txt,'errcatch')
155         if ierr<>0 then
156           error("Problem in convertion of graphics in block.")
157         end
158         o_new.graphics = ogra;
159         //*******************************//
160
161         //************* model ***********//
162         case 'model' then
163           omod  = blk.model;
164           M     = getfield(1,blk.model);
165           M_txt = [];
166           for l=2:size(M,2)
167              M_txt = M_txt + M(1,l) + ...
168                       "=" + "omod." + M(1,l);
169              if l<>size(M,2) then
170                  M_txt = M_txt + ',';
171              end
172           end
173           M_txt = 'omod=scicos_model(' + M_txt + ')';
174           ierr  = execstr(M_txt,'errcatch')
175           if ierr<>0 then
176             error("Problem in convertion of model in block.")
177           end
178           o_new.model = omod;
179           //*******************************//
180
181           //************* other ***********//
182           else
183             T_txt = "blk."+T(k);
184             T_txt = "o_new." + T(k) + "=" + T_txt;
185             ierr  = execstr(T_txt,'errcatch')
186             if ierr<>0 then
187                error("Problem in convertion in objs.")
188             end
189           //*******************************//
190
191      end  //end of select T(k)
192   end  //end of for k=
193   blk = o_new;
194   //**------------------------------------/////////
195
196   //**------ Al@n's update ---------/////////////
197   if blk.model.sim(1)=='super'|...
198       blk.model.sim(1)=='csuper' then
199
200     scs_m_super = blk.model.rpar;
201
202     [ierr,scicos_ver,scs_m_super]=update_version(scs_m_super)
203
204     if ierr<>0 then
205       message("Can''t import block in scicos, sorry (problem in version)")
206       fct=[]
207       return
208     end
209
210     //## if we have do a convertion
211     if scicos_ver<>get_scicos_version() then
212       blk.model.rpar = scs_m_super;
213
214       //check name
215       if scs_m_super.props.title(1)<>name then
216          scs_m_super.props.title(1)=name
217       end
218
219       //generate a new interfacing function in TMPDIR
220       if blk.model.sim(1)=='super' then
221         save_super(scs_m_super,TMPDIR,blk.graphics.gr_i,blk.graphics.sz)
222       elseif blk.model.sim(1)=='csuper' then
223         save_csuper(scs_m_super,TMPDIR,blk.graphics.gr_i,blk.graphics.sz)
224         tt=mgetl(TMPDIR+'/'+name+'.sci');
225         mputl(tt,TMPDIR+'/'+name+'_new.sci');
226         //**------ R@min's update ---------/////////////
227          [u,err]=file('open',TMPDIR+'/'+name+'.sci','unknown')
228          if err<>0 then
229            message('The file '+TMPDIR+'/'+name+'.sci'+' cannot be opened.')
230            return
231          end
232
233          Txte=['function [x,y,typ]='+name+'(job,arg1,arg2)';
234                'x=[];y=[],typ=[]';
235                'if job<>''define'' then ';
236                '  if argn(2)<2 then arg1=[],end'
237                '  [x,y,typ]=%fonct'+name+'(job,arg1)';
238                'else'
239                ];
240          ierr=execstr('write(u,Txte,''(a)'')','errcatch','n')
241          if ierr<>0 then 
242                message('Impossible to write in '+TMPDIR+'/'+name+'.sci'+'; possibly locked.')
243                file('close',u)
244                return
245          end
246          dimen=blk.graphics.sz// /20  // why RN
247          dimen=dimen(:)'
248          textdef=['  model=scicos_model()']
249          model=blk.model
250          cc=getfield(1,model)
251          cos2cosf(u,model.rpar,0)
252
253          for ch=cc(2:$)
254            if ch=='rpar' then
255              textdef=[textdef;
256                       '  model.rpar=scs_m_1'];
257            else
258              chval=sci2exp(evstr('model.'+ch))
259              textdef=[textdef;
260                       '  model.'+ch+'='+chval(1);
261                       chval(2:$)];
262            end
263          end
264
265          textdef=[textdef;
266                   '  exprs='+sci2exp(blk.graphics.exprs)
267                  ]
268
269          gr_i_tmp = sci2exp(blk.graphics.gr_i);
270          if size(gr_i_tmp,1)<>1 then
271            textdef=[textdef;
272                     '  gr_i='+gr_i_tmp(1)
273                     '       '+gr_i_tmp(2:$)];
274          else
275            textdef=[textdef;
276                     '  gr_i='+gr_i_tmp];
277          end
278
279          textdef=[textdef;
280                   '  x=standard_define('+sci2exp(dimen)+',model,exprs,gr_i)']
281          txt=[textdef
282               'end'
283               'endfunction'
284               ''
285               fun2string(evstr(name),'%fonct'+name);
286              ]
287          write(u,txt,'(a)')
288          file('close',u)
289         //**-------------------------------/////////////
290       end
291       nam_file=strcat([name,name+'_new']+'.sci',' ')
292       message(["Old csuper/super block have been detected !";
293                "New interfacing functions "+nam_file;
294                " have been re-generated in "+TMPDIR+".";
295                "Please save and edit the generated file at your convenience";
296                "to have an updated interfacing function of that block."])
297     end
298   end
299   //**------------------------------------/////////////
300
301 //**--------------------------------------------------------------------------------------
302 //** The requested block is valid, then it is accepted
303 //** ---------------------- The graphics interaction begin here --------------------------
304
305 //** This code basically works ( :-) ) : it is the "Replot" that need attention :)
306
307   xinfo("Choose block position in the window");
308
309   blk.graphics.sz = 20 * blk.graphics.sz;
310   %xc = 100; %yc = 100; //** default start position
311    xy = [%xc,%yc] ;
312   blk.graphics.orig = xy ; 
313
314   gh_blk = drawobj(blk); //** draw the block (in the buffer) - using the corresponding Interface Function
315                          //** Scilab Language - of the specific block (blk) and get back the graphic handler
316                          //** to handle the block as a single entity
317
318 //**-----------------------------------------------------------------
319 //** ---> main loop that move the empty box until you click
320   rep(3)=-1 ;
321   while rep(3)<=-1 , //move loop
322
323     // get new position
324     rep = xgetmouse([%t,%t]); //** 
325
326     //** Protection from window closing
327     if rep(3)==-1000 then //active window has been closed
328       [%win,Cmenu] = resume(curwin,"Quit")
329     end
330
331     xm = rep(1) ; //** coordinate acquisition  
332     ym = rep(2) ;
333     dx = xm - %xc ; //** incremental coordinate 
334     dy = ym - %yc ;
335     drawlater();
336      move (gh_blk , [dx dy]);
337      //**draw(gh_blk.parent); //** re-draw the graphic object and show on screen
338      drawnow(); 
339      //** show_pixmap() ; //** not useful on Scilab 5
340
341      %xc = xm ;%yc = ym ; //** position update
342
343   end //** ---> of the while loop
344 //**----------------------------------------------------------------------
345   
346   //** out-of-the-loop window closing protection 
347   gh_window = gcf(); 
348   if gh_window.figure_id <> curwin then
349     //active window has been closed
350     [%win, Cmenu] = resume(curwin,"Quit")
351   end
352
353   xinfo(" "); 
354
355   xy = [%xc,%yc];
356   blk.graphics.orig = xy ; //** update object position in the data strucure
357
358   scs_m_save = scs_m       ;
359   nc_save    = needcompile ;
360    
361   scs_m.objs($+1) = blk ; //** add the object to the data structure
362
363   needcompile = 4     
364   [scs_m_save, nc_save, enable_undo, edited] = resume(scs_m_save,nc_save,%t,%t)
365
366 endfunction
367
368 //**---------------------------------------------------------------------------------------------------
369
370 function objsi = up_to_date(o)
371   if size(o(2)) > 8 then
372     if type(o(2)(9))==15 then 
373       gr_io=o(2)(9)(1);
374       if o(2)(9)(2)<>[] then
375         back_col=o(2)(9)(2);,
376       end
377     else
378       gr_io=o(2)(9);
379       back_col=8
380     end
381     gr_i=convert_gri(o(5),gr_io);
382     if gr_i==[] then gr_i=gr_io;, end
383   elseif size(o(2)) < 9 then
384     gr_i=[];
385     back_col=8
386   end
387   gr_i=list(gr_i,back_col)
388
389   mdl=o(3);
390   if size(o(3))<=12 then 
391     mdl(13)=''; mdl(14)=[] ; mdl(15)='';
392   elseif size(o(3))<=13 then 
393     mdl(14)=[] ; mdl(15)='';
394   elseif size(o(3))<=14 then 
395     mdl(15)='';
396   end
397
398   if mdl(1)(1)=='super'|mdl(1)(1)=='csuper' then
399     if type(mdl(8))==15 then
400       mdl(8)=do_version27(mdl(8))
401     end
402   end
403
404   graphics=scicos_graphics(orig=o(2)(1),sz=o(2)(2),flip=o(2)(3),..
405                            exprs=o(2)(4),pin=o(2)(5),pout=o(2)(6),..
406                            pein=o(2)(7),peout=o(2)(8),gr_i=gr_i,..
407                            id=mdl(15))
408
409   model=scicos_model(sim=mdl(1),in=mdl(2),out=mdl(3),evtin=mdl(4),..
410                      evtout=mdl(5),state=mdl(6),dstate=mdl(7),..
411                      rpar=mdl(8),ipar=mdl(9),blocktype=mdl(10),..
412                      firing=mdl(11),dep_ut=mdl(12),label=mdl(13))
413   
414   
415   objsi=scicos_block(graphics=graphics,model=model,gui=o(5),..
416                      doc=mdl(14))
417   if objsi.gui=='ESELECT_f' then objsi.model.sim(2)=-2,end
418
419 endfunction
420
421