function [x,y,typ]=CURVE_c(job,arg1,arg2) // Masoud Najafi 07/2007 -------- // origine: serge Steer, Habib Jreij INRIA 1993 // Copyright INRIA x=[];y=[];typ=[]; select job case 'plot' then standard_draw(arg1) case 'getinputs' then [x,y,typ]=standard_inputs(arg1) case 'getoutputs' then [x,y,typ]=standard_outputs(arg1) case 'getorigin' then [x,y]=standard_origin(arg1) case 'set' then x=arg1 model=arg1.model graphics=arg1.graphics exprs=graphics.exprs ok=%f; SaveExit=%f while %t do Ask_again=%f [ok,Method,xx,yy,PeriodicOption,graf,exprs]=getvalue('Spline data',['Spline"+... " Method (0..7)';'x';'y';'Periodic signal(y/n)?';'Launch"+... " graphic window(y/n)?'],list('vec',1,'vec',-1, ... 'vec',-1,'str',1,'str',1),exprs) if ~ok then break;end if PeriodicOption=='y' | PeriodicOption=='Y' then,PO=1;else,exprs(4)='n';PO=0;end mtd=int(Method); if mtd<0 then mtd=0;end; if mtd>7 then mtd=7;end; METHOD=getmethod(mtd); if ~Ask_again then xx=xx(:);yy=yy(:); [nx,mx]=size(xx); [ny,my]=size(yy); if ~((nx==ny)&(mx==my)) then, x_message('incompatible size of x and y'); Ask_again=%t;end end if ~Ask_again then//+++++++++++++++++++++++++++++++++++++++ xy=[xx,yy]; [xy]=cleandata(xy);// just for sorting to be able to compare data before and after poke_point(.) N= size(xy,'r'); exprs(5)='n';// exprs.graf='n' if graf=='y' | graf=='Y' then //_______Graphic editor___________ ipar=[N;mtd;PO]; rpar=[]; if ~exists('curwin') then gh=gcf(); curwin=gh.figure_id end save_curwin=curwin; curwin=max(winsid())+1; [orpar,oipar,ok]=poke_point(xy,ipar,rpar); curwin=save_curwin; if ~ok then break;end;// exit without save // verifying the data change N2=oipar(1);xy2=[orpar(1:N2),orpar(N2+1:2*N2)]; New_methhod=oipar(2); DChange=%f; METHOD=getmethod(New_methhod); if or(xy(:,1)<>xy2(:,1)) then, DChange=%t;end if or(xy(1:N-1,2)<>xy2(1:N2-1,2)) then, DChange=%t;end if (xy(N,2)<>xy2(N2,2) & (METHOD<>'periodic')) then, DChange=%t;end if DChange then exprs(2)=strcat(sci2exp(xy2(:,1))) exprs(3)=strcat(sci2exp(xy2(:,2))) end exprs(1)=sci2exp(New_methhod); if oipar(3)==1 then,perop='y';else,perop='n';end exprs(4)=perop; SaveExit=%t else//_____________________No graphics__________________________ [Xdummy,Ydummy,orpar]=Do_Spline(N,mtd,xy(:,1),xy(:,2)); if (METHOD=='periodic') then // periodic spline xy(N,2)=xy(1,2); end if (METHOD=='order 2' | METHOD=='not_a_knot'|METHOD=='periodic' | METHOD=='monotone'| METHOD=='fast' | METHOD=='clamped') then orpar=[xy(:,1);xy(:,2);orpar]; else if (METHOD=='zero order'|METHOD=='linear') orpar=[xy(:,1);xy(:,2);] end end exprs(1)=sci2exp(mtd);// pour le cas methode>7 | method<0 oipar=[N;mtd;PO] SaveExit=%t end //___________________________________________________________ end //++++++++++++++++++++++++++++++++++++++++++++++++++++++ if (SaveExit) then xp=find(orpar(1:oipar(1))>=0); if (xp<>[]) then model.firing=orpar(xp(1)); //first positive event else model.firing=-1; end model.rpar=orpar model.ipar=oipar graphics.exprs=exprs; x.model=model x.graphics=graphics break end end case 'define' then model=scicos_model() xx=[0, 1, 2];yy=[10, 20, -30]; N=3; Method=3; PeriodicOption='y'; Graf='n' model.sim=list('curve_c',4) model.in=[] model.out=1 model.rpar=[xx(:);yy(:)] model.ipar=[N;Method;1] model.blocktype='c' model.dep_ut=[%f %t] model.evtin=1 model.evtout=1 model.firing=0 exprs=[sci2exp(Method);sci2exp(xx);sci2exp(yy);PeriodicOption;Graf] gr_i=['rpar=arg1.model.rpar;n=model.ipar(1);order=model.ipar(2);'; 'xx=rpar(1:n);yy=rpar(n+1:2*n);'; '[XX,YY,rpardummy]=Do_Spline(n,order,xx,yy)'; 'xmx=maxi(XX);xmn=mini(XX);'; 'ymx=maxi(YY);ymn=mini(YY);'; 'dx=xmx-xmn;if dx==0 then dx=maxi(xmx/2,1);end'; 'xmn=xmn-dx/20;xmx=xmx+dx/20;'; 'dy=ymx-ymn;if dy==0 then dy=maxi(ymx/2,1);end;'; 'ymn=ymn-dy/20;ymx=ymx+dy/20;'; 'xx2=orig(1)+sz(1)*((XX-xmn)/(xmx-xmn));'; 'yy2=orig(2)+sz(2)*((YY-ymn)/(ymx-ymn));'; 'xset(''color'',2)'; 'xpoly(xx2,yy2,''lines'');'] x=standard_define([2 2],model,exprs,gr_i) end endfunction function [rpar,ipar,ok]=poke_point(ixy,iparin,rparin) [lhs,rhs]=argn(0) //in line definition of get_click deff('[btn,xc,yc,win,Cmenu]=get_click(flag)',[ 'if ~or(winsid() == curwin) then Cmenu = ''Quit'';return,end,'; 'if argn(2) == 1 then'; ' [btn, xc, yc, win, str] = xclick(flag);'; 'else'; ' [btn, xc, yc, win, str] = xclick();'; 'end;'; 'if btn == -100 then'; ' if win == curwin then'; ' Cmenu = ''Quit'';'; ' else'; ' Cmenu = ''Open/Set'';'; ' end,'; ' return,'; 'end'; 'if btn == -2 then'; ' xc = 0;yc = 0;'; ' try ' // added to handle unwanted menu actions in french version ' execstr(''Cmenu='' + part(str, 9:length(str) - 1));'; ' execstr(''Cmenu='' + Cmenu);'; ' catch' ' Cmenu=[]' ' end ' ' return,'; 'end'; 'Cmenu=[]']) ok=%f if rhs==0 then ixy=[];end; if size(xy,'c')<2 then xinfo(' No y provided'); return end [xy]=cleandata(ixy) N=size(xy,'r'); if rhs<=1 then NOrder=1; PeridicOption=0; ipar=[N;NOrder;PeridicOption] rpar=[] else if rhs==2 then NOrder=iparin(2); PeridicOption=iparin(3); ipar=iparin; rpar=[] else if rhs==3 then NOrder=iparin(2); PeridicOption=iparin(3); ipar=iparin; rpar=rparin end end end Amp=[];wp=[]; phase=[];offset=[];np1=[]; Sin_exprs=list(string(Amp),string(wp), string(phase),string(offset),string(np1)); sAmp=[];sTp=[]; sdelay=[]; Sawt1_exprs=list(string(sAmp),string(sTp),string(sdelay)); sAmp2=[];sTp2=[]; Sawt2_exprs=list(string(sAmp2),string(sTp2)); Amp3=[];Tp3=[];Pw3=[];Pd3=[];Bias3=[]; Pulse_exprs=list(string(Amp3), string(Tp3),string(Pw3),string(Pd3),string(Bias3)) mean4=[];var4=[];seed4=[];sample4=[];np4=[]; random_n_exprs=list(string(mean4),string(var4), string(seed4),string(sample4),string(np4)) min5=[];max5=[];seed5=[];sample5=[];np5=[]; random_u_exprs=list(string(min5), string(max5), string(seed5),string(sample5),string(np5)) // bornes initiales du graphique xmx=maxi(xy(:,1));xmn=mini(xy(:,1)),xmn=max(xmn,0); ymx=maxi(xy(:,2));ymn=mini(xy(:,2)); dx=xmx-xmn;dy=ymx-ymn if dx==0 then dx=maxi(xmx/2,1),end; xmx=xmx+dx/50; if dy==0 then dy=maxi(ymx/2,1),end; ymn=ymn-dy/50;ymx=ymx+dy/50; rect=[xmn,ymn;xmx,ymx]; //=================================================================== f=scf(); if ~MSDOS then delmenu(curwin,'3D Rot.') delmenu(curwin,'Edit') delmenu(curwin,'File') delmenu(curwin,'Insert') else hidetoolbar(curwin) // French delmenu(curwin,'&Fichier') delmenu(curwin,'&Editer') delmenu(curwin,'&Outils') delmenu(curwin,'&Inserer') // English delmenu(curwin,'&File') delmenu(curwin,'&Edit') delmenu(curwin,'&Tools') delmenu(curwin,'&Insert') end //menuss=menus;menuss(1)=menus(1)(2:$);menubar(curwin,menuss) menu_r=[]; menu_s=[]; menu_o=['zero order','linear','order 2','not_a_knot','periodic','monotone','fast','clamped'] menu_d=['Clear','Data Bounds','Load from text f"+... "ile','Save to text file','Load from Excel','Periodic signal'] menu_t=['sine','sawtooth1','sawtooth2','pulse','random normal','random uniform'] menu_e=['Help','Exit without save','Save/Exit'] MENU=['Autoscale','Spline','Data','Standards','Exit']; menus=list(MENU,menu_s,menu_o,menu_d,menu_t,menu_e); scam='menus(1)(1)' w='menus(3)(';r=')';Orderm=w(ones(menu_o))+string(1:size(menu_o,'*'))+r(ones(menu_o)) w='menus(4)(';r=')';Datam=w(ones(menu_d))+string(1:size(menu_d,'*'))+r(ones(menu_d)) w='menus(5)(';r=')';Standm=w(ones(menu_t))+string(1:size(menu_t,'*'))+r(ones(menu_t)) w='menus(6)(';r=')';Exitm=w(ones(menu_e))+string(1:size(menu_e,'*'))+r(ones(menu_e)) execstr('Autoscale_'+string(curwin)+'=scam') execstr('Spline_'+string(curwin)+'=Orderm') execstr('Data_'+string(curwin)+'=Datam') execstr('Standards_'+string(curwin)+'=Standm') execstr('Exit_'+string(curwin)+'=Exitm') addmenu(curwin,MENU(1)) addmenu(curwin,MENU(2),menu_o) addmenu(curwin,MENU(3),menu_d) addmenu(curwin,MENU(4),menu_t) addmenu(curwin,MENU(5),menu_e) //=================================================================== //initial draw f.pixmap='off'; drawlater(); a=gca(); a.data_bounds=rect; a.axes_visible='on'; a.clip_state='on'; xtitle( '', 'time', 'Output' ) ; a.title.font_size=2; a.title.font_style=4; a.title.foreground=2; a.grid=[2 2]; xpolys(xy(:,1),xy(:,2),[-1]); //children(2) xpolys(xy(:,1),xy(:,2),[5]); //children(1) splines=a.children(1).children points=a.children(2).children //--------------------------------------- [rpar,ipar]=AutoScale(a,xy,ipar,rpar) drawnow(); // -- boucle principale lines(0); while %t then //================================================= N=size(xy,'r'); [btn,xc,yc,win,Cmenu]=get_click(); if ((win>0) & (win<>curwin)) then Cmenu='Mouse click is Offside!'; end if Cmenu==[] then Cmenu='edit',end if (Cmenu=='Exit') |(Cmenu=='Quit' ) then, ipar=[];rpar=[];ok=%f;return; end //------------------------------------------------------------------- if ((Cmenu=='zero order') | (Cmenu=='linear') | (Cmenu=='order 2')| ... (Cmenu=='not_a_knot')| (Cmenu=='periodic')| (Cmenu=='monotone')| ... (Cmenu=='fast')| (Cmenu=='clamped')) then select Cmenu case 'zero order' then NOrder=0; case 'linear' then NOrder=1; case 'order 2' then NOrder=2; case 'not_a_knot' then NOrder=3; case 'periodic' then NOrder=4; case 'monotone' then NOrder=5; case 'fast' then NOrder=6; case 'clamped' then NOrder=7; end ipar(2)=NOrder; [rpar,ipar]=AutoScale(a,xy,ipar,rpar) end //------------------------------------------------------------------- select Cmenu case 'Data Bounds' then rectx=findrect(a); [mok,xmn1,xmx1,ymn1,ymx1]=getvalue('Enter new bounds',['xmin';'xmax'; ... 'ymin';'ymax'],list('vec',1,'vec',1,'vec',1,'vec',1), ... string(rectx)) //drawlater(); if mok then if (xmn1>xmx1|ymn1>ymx1) then xinfo('Incorrect bounds') mok=%f; end if xmn1<0 then xinfo('X soululd be positive') mok=%f; end if mok then a.data_bounds=[xmn1,ymn1;xmx1,ymx1]; end end //drawnow();//show_pixmap(); //------------------------------------------------------------------- case 'Autoscale' then [rpar,ipar]=AutoScale(a,xy,ipar,rpar) //------------------------------------------------------------------- case 'Periodic signal' then if PeridicOption==1 then, ans0='y',else, ans0='n',end; [mok,myans]=getvalue('Generating periodic signal',['y/n'],list('str',1),list(ans0)); if ((myans=='y')|(myans=='Y')) then,PeridicOption=1,else,PeridicOption=0;end; ipar(3)=PeridicOption; [rpar,ipar]=AutoScale(a,xy,ipar,rpar) //------------------------------------------------------------------- case 'sine' then [mok,Amp,wp,phase,offset,np1,Sin_exprs2]=getvalue(' Sine parameters', ... ['Amplitude';'Frequency(rad/sec)'; ... 'Phase(rad)';'Bias';'number of points'],list('vec',1,'vec',1,'vec',1, ... 'vec',1,'vec',1),Sin_exprs) if np1< 2 then np1=2;end if mok & wp>0 then NOrder=3; ipar(2)=NOrder; phase=atan(tan(phase)); xt=linspace(0,%pi*2/wp,np1)'; yt=Amp*sin(wp*xt+phase)+offset; xy=[xt,yt]; [rpar,ipar]=AutoScale(a,xy,ipar,rpar) Sin_exprs=Sin_exprs2 end //------------------------------------------------------------------- case 'sawtooth1' then [mok,sAmp,sTp,sdelay,Sawt1_exprs2]=getvalue('Sawtooth signal parameters', ... ['Amplitude';'Period';'delay'], ... list('vec',1,'vec',1,'vec',1),Sawt1_exprs) if mok & sTp>0 then NOrder=1; ipar(2)=NOrder; if sdelay<sTp then xt=[0;sdelay;sTp]; yt=[0;0;sAmp]; else xt=[0]; yt=[0]; end xy=[xt,yt]; [rpar,ipar]=AutoScale(a,xy,ipar,rpar); Sawt1_exprs=Sawt1_exprs2 end //------------------------------------------------------------------- case 'sawtooth2' then [mok,sAmp2,sTp2,Sawt2_exprs2]=getvalue('Sawtooth signal parameters', ... ['Amplitude';'Period'],list('vec',1,'vec',1),Sawt2_exprs) if mok & sTp2>0 then NOrder=1; ipar(2)=NOrder; xt=[0;sTp2]; yt=[sAmp2;-sAmp2]; xy=[xt,yt]; [rpar,ipar]=AutoScale(a,xy,ipar,rpar); Sawt2_exprs=Sawt2_exprs2 end //------------------------------------------------------------------- case 'pulse' then [mok,Amp3,Tp3,Pw3,Pd3,Bias3,Pulse_exprs2]=getvalue('Square wave pulse signal', ... ['Amplitude';'Period (sec)';'Pulse width(% o"+... "f period)';'Phase delay (sec)';'Bias'],list('vec',1, ... 'vec',1,'vec',1,'vec',1,'vec', ... 1),Pulse_exprs) if mok & Tp3>0 then NOrder=0; ipar(2)=NOrder; if (Pd3>0) then xt=0;yt=Bias3;else xt=[];yt=[]; end //otherwise there would be double points at 0 if Pd3<Tp3 then if Pw3>0 then xt=[xt;Pd3; Pw3*Tp3/100+Pd3;Tp3]; yt=[yt;Amp3+Bias3;Bias3;Bias3]; else xt=[0;Tp3];yt=[Bias3;Bias3]; end else xt=[0;Tp3];yt=[Bias3;Bias3]; end xy=[xt,yt]; [rpar,ipar]=AutoScale(a,xy,ipar,rpar); Pulse_exprs=Pulse_exprs2; end //------------------------------------------------------------------- case 'random normal' then [mok,mean4,var4,seed4,sample4,np4,random_n_exprs2]=getvalue('Normal (Gaussian) random signal', ... ['Mean';'Variance';'Initial seed';'Sample time';'Number of points'],list('vec',1, ... 'vec',1,'vec',1,'vec', ... 1,'vec',1),random_n_exprs) if mok & sample4>0 then NOrder=0; ipar(2)=NOrder; rand('normal'); rand('seed',seed4); xt=0:sample4:sample4*(np4-1);xt=xt(:); yt=mean4+sqrt(var4)*rand(np4,1); xy=[xt,yt]; [rpar,ipar]=AutoScale(a,xy,ipar,rpar); random_n_exprs2=random_n_exprs; end //------------------------------------------------------------------- case 'random uniform' then [mok,min5,max5,seed5,sample5,np5,random_u_exprs2]=getvalue('Uniform random signal', ... ['Minimum';'Maximum';'Initial seed';'Sample time';'Number of points'],list('vec',1, ... 'vec',1,'vec',1,'vec', ... 1,'vec',1),random_u_exprs) if mok & sample5>0 then NOrder=0; ipar(2)=NOrder; rand('uniform'); rand('seed',seed5); xt=0:sample5:sample5*(np5-1);xt=xt(:); yt=min5+(max5-min5)*rand(np5,1); xy=[xt,yt]; [rpar,ipar]=AutoScale(a,xy,ipar,rpar); random_u_exprs2=random_u_exprs; end //------------------------------------------------------------------- case 'Save/Exit' then NOrder=ipar(2); PeridicOption=ipar(3); METHOD=getmethod(NOrder); if (METHOD=='periodic') then // periodic spline xy(N,2)=xy(1,2); end if (METHOD=='order 2' | METHOD=='not_a_knot'|METHOD=='periodic' | METHOD=='monotone'| METHOD=='fast' | METHOD=='clamped') then rpar=[xy(:,1);xy(:,2);rpar]; else if (METHOD=='zero order'|METHOD=='linear') rpar=[xy(:,1);xy(:,2);] end end ok=%t delete(f); return //------------------------------------------------------------------- case 'Exit without save' then ipar=[]; rpar=[]; ok=%f delete(f); return //------------------------------------------------------------------- case 'Clear' then xy=[0,0]; NOrder=0; ipar(2)=NOrder; [rpar,ipar]=AutoScale(a,xy,ipar,rpar) //---------------------------------------------------------------- case 'Edit text data NOT IN USE' then // editvar xy; [mok,xt,yt]=getvalue('Enter x and y data',['x';'y'],list('vec',-1,'vec',-1),list(strcat(sci2exp(xy(:,1))),strcat(sci2exp(xy(:,2))))); if mok then, xy=[xt,yt]; [xy]=cleandata(xy), [rpar,ipar]=AutoScale(a,xy,ipar,rpar) end //--------------------------------------------------------------- case 'Help' then t1='Mouse-left click: adding a new point' t2='Mouse-right click: remove a point' t3='Mouse-left double click: edit a point''s coordinates' t4='Mouse-left button press/drag/release: move a point' t5='Change the window size: ''Data'' menu -> ''Databounds''' x_message([t1;t2;t3;t4;t5]); //--------------------------------------------------------------- case 'Load from Excel' then [tok,xytt]=ReadExcel() if tok then xy=xytt; NOrder=1 ipar(2)=NOrder; [rpar,ipar]=AutoScale(a,xy,ipar,rpar) end //--------------------------------------------------------------- case 'Load from text file' then [tok,xytt]=ReadFromFile() if tok then xy=xytt; NOrder=1 ipar(2)=NOrder; [rpar,ipar]=AutoScale(a,xy,ipar,rpar) end //--------------------------------------------------------------- case 'Save to text file' then [sok]=SaveToFile(xy) //--------------------------------------------------------------- case 'Replot' then if xy<>[] then drawlater(); points.data=xy; [rpar,ipar]=drawSplin(a,xy,ipar,rpar); drawnow() end //---------------------------------------------------------- case 'edit' then HIT=%f if N<>0 then xt=xy(:,1);yt=xy(:,2); dist=((xt-ones(N,1)*xc))^2+((yt-ones(N,1)*yc))^2 [dca,k]=mini(dist); rectx=a.data_bounds; ex=abs(rectx(2,1)-rectx(1,1))/80; ey=abs(rectx(2,2)-rectx(1,2))/80; if (abs(xc-xt(k))<ex & abs(yc-yt(k))<ey) then HIT=%t end end //_________________________ // if ~((NOrder==-1|NOrder==-2|NOrder==-3|NOrder==-4)) then if (~HIT)&(btn==0 | btn==3) then // add point if (xc>=0) then if (xc==0) then zz=find(x==0); xy(zz,:)=[]; end xy=[xy;xc,yc]; [xtt,k2]=gsort(xy(:,1),'r','i');xy=xy(k2,:) f.pixmap='on'; drawlater(); points.data=xy; [rpar,ipar]=drawSplin(a,xy,ipar,rpar); show_pixmap(); drawnow() f.pixmap='off'; end end if (HIT)&(btn==2 | btn==5) then // remove point f.pixmap='on'; if (xy(k,1)>0) |( xy(k,1)==0 & (size(find(xy(:,1)==0),'*')>1)) then xy(k,:)=[]; end drawlater(); points.data=xy; [rpar,ipar]=drawSplin(a,xy,ipar,rpar); show_pixmap(); drawnow() f.pixmap='off'; end if (HIT)&(btn==0) then // move point f.pixmap='on'; [xy,rpar,ipar]=movept(a,xy,ipar,rpar,k) f.pixmap='off'; end if (HIT)&(btn==10) then // change data:: double click [mok,xt,yt]=getvalue('Enter new x and y',['x';'y'],list('vec', ... 1,'vec',1),list(sci2exp(xy(k,1)),sci2exp(xy(k,2)))); if mok then xy(k,:)=[xt,yt]; [xy]=cleandata(xy) f.pixmap='on'; drawlater(); points.data=xy; [rpar,ipar]=AutoScale(a,xy,ipar,rpar) show_pixmap(); drawnow() f.pixmap='off'; end end // end //_________________________________ end //---------------------------------------------------------- end endfunction //======================================================================== function [orpar,oipar]=drawSplin(a,xy,iipar,irpar) N=size(xy,'r');// new size of xy x=xy(:,1); y=xy(:,2); points=a.children(2).children splines=a.children(1).children order=iipar(2); periodicoption=iipar(3); orpar=irpar; METHOD=getmethod(order); if periodicoption==1 then PERIODIC='periodic, T='+string(x(N)-x(1)); else PERIODIC='aperiodic';end a.title.text=[string(N)+' points, '+'Method: '+METHOD+', '+PERIODIC]; if (N==0) then, return; end if (N==1) then, order=0; end // NP=50;// number of intermediate points between two data points [X,Y,orpar]=Do_Spline(N,order,x,y); if (periodicoption==1) then X=[X;X($)]; Y=[Y;Y(1)]; else xmx=maxi(points.data(:,1)); xmn=mini(points.data(:,1)); XMX=max(0,xmx); XMN=max(0,xmn); xmx1=max(a.x_ticks.locations) XMX=max(XMX,xmx1); X=[X;XMX]; Y=[Y;Y($)]; end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! splines.data=[X,Y]; oipar=[N;iipar(2);periodicoption] endfunction //============================================================= function [xyt,orpar,oipar]=movept(a,xy,iipar,irpar,k) //on bouge un point existant points=a.children(2).children splines=a.children(1).children oipar=iipar orpar=irpar order=iipar(2); x=xy(:,1); y=xy(:,2); if (x(k)==0) then zz=find(x==0); x(zz)=[];y(zz)=[]; ZERO_POINT=%t else x(k)=[]; y(k)=[]; ZERO_POINT=%f end btn=-1 while ~(btn==3 | btn==0| btn==10| btn==-5) rep=xgetmouse([%t %t]); xc=rep(1);yc=rep(2);btn=rep(3); if (ZERO_POINT) then xc=0; else if (xc<=0) then zz=find(x==0); x(zz)=[];y(zz)=[]; ZERO_POINT=%t; xc=0; end end xt=[x;xc]; yt=[y;yc]; [xt,k2]=gsort(xt,'r','i');yt=yt(k2) xyt=[xt,yt]; drawlater(); points.data=xyt; [orpar,oipar]=drawSplin(a,xyt,oipar,orpar); show_pixmap(); drawnow() end endfunction //========================================================== function rectx=findrect(a) splines=a.children(1).children points=a.children(2).children if (points.data==[]) then rectx=a.data_bounds; return; end ymx1=max(splines.data(:,2)); ymn1=min(splines.data(:,2)) xmx=maxi(points.data(:,1));xmn=mini(points.data(:,1)); ymx=maxi(points.data(:,2));ymn=mini(points.data(:,2)); XMX=max(0,xmx); XMN=max(0,xmn); YMX=max(ymx,ymx1); YMN=min(ymn,ymn1); dx=XMX-XMN;dy=YMX-YMN if dx==0 then dx=maxi(XMX/2,1),end; XMX=XMX+dx/50 if dy==0 then dy=maxi(YMX/2,1),end; YMN=YMN-dy/50;YMX=YMX+dy/50; rectx=[XMN,YMN;XMX,YMX]; endfunction //============================================================ function [tok,xyo]=ReadExcel() TA=['A';'B';'C';'D';'E';'F';'G';'H';'I';'J';'K';'L';'M';'N';'O';'P'; ... 'Q';'R';'S';'T';'U';'V';'W';'X';'Y';'Z';'a';'b';'c';'d';'e';'f'; ... 'g';'h';'i';'j';'k';'l';'m';'n';'o';'p';'q';'r';'s';'t';'u';'v'; ... 'w';'x';'y';'z']; TN=['0','1','2','3','4','5','6','7','8','9']; xyo=[];tok=%f; while %t [zok,filen,sheetN,xa,ya]=getvalue('Excel data file ',['Filename';'Sheet #"+... " ';'X[start:Stop]';'Y[start:stop]'],list('str',1, ... 'vec',1,'str',1, ... 'str',1), ... list(['Classeur1.xls'],['1'],['C5:C25'],['D5:D25'])); if ~zok then break,end try [fd,SST,Sheetnames,Sheetpos] = xls_open(filen); catch xinfo('Scicos canot find the excel file:'+filen); break; end try N=size(Sheetnames,'*'); if ((sheetN<=N) &(sheetN>0)) then [Value,TextInd] = xls_read(fd,Sheetpos(sheetN)) mclose(fd) end xa=strsubst(xa,' ',''); px=strindex(xa,':'); ya=strsubst(ya,' ',''); py=strindex(ya,':'); x1=part(xa,1:px-1); x2=part(xa,px+1:length(xa)); y1=part(ya,1:py-1); y2=part(ya,py+1:length(ya)); x1p=min(strindex(x1,TN)); if x1p==[] then, xinfo('Bad address in X:'+x1); break, end x11=part(x1,1:x1p-1);x12=part(x1,x1p:length(x1)); x2p=min(strindex(x2,TN)); if x2p==[] then, xinfo('Bad address in X:'+x2); break, end x21=part(x2,1:x2p-1);x22=part(x2,x2p:length(x2)); y1p=min(strindex(y1,TN)); if y1p==[] then, xinfo('Bad address in Y:'+y1); break, end y11=part(y1,1:y1p-1);y12=part(y1,y1p:length(y1)); y2p=min(strindex(y2,TN)); if y2p==[] then, xinfo('Bad address in Y:'+y2); break, end y21=part(y2,1:y2p-1);y22=part(y2,y2p:length(y2)); // x11 x12: x21 x22 lx11=length(x11);lx21=length(x21); ly11=length(y11);ly21=length(y21) xstC=0;for i=1:lx11,xstC=xstC+modulo(find(TA==part(x11,lx11-i+1)),26)*26^(i-1);end xenC=0;for i=1:lx21,xenC=xenC+modulo(find(TA==part(x21,lx21-i+1)),26)*26^(i-1);end ystC=0;for i=1:ly11,ystC=ystC+modulo(find(TA==part(y11,ly11-i+1)),26)*26^(i-1);end yenC=0;for i=1:ly11,yenC=yenC+modulo(find(TA==part(y21,ly21-i+1)),26)*26^(i-1);end xstR=evstr(x12); xenR=evstr(x22); ystR=evstr(y12); yenR=evstr(y22); [mv,nv]=size(Value) if ~(xstR<=mv & xstR>0 & xenR<=mv & xenR>0&ystR<=mv & ystR>0¥R<=mv¥R>0 ) then xinfo('error in Row data addresses'); break end if ~(xstC<=nv & xstC>0 & xenC<=nv & xenC>0&ystC<=nv & ystC>0¥C<=nv¥C>0 ) then xinfo('error in Column data addresses'); break end xo=Value(min(xstR,xenR):max(xstR,xenR),min(xstC,xenC):max(xstC,xenC)); yo=Value(min(ystR,yenR):max(ystR,yenR),min(ystC,yenC):max(ystC,yenC)); [nx,mx]=size(xo);// adjusting the x and y size [ny,my]=size(yo); N=min(nx,ny); xo=xo(1:N,:); yo=yo(1:N,:); xyo=[xo,yo]; [xyo]=cleandata(xyo) tok=%t;break, catch xinfo(' Scicos cannot read your Excel file, please verify"+... " the parameters '); break end end endfunction //--------------------------------------------------------------- function [xyo]=cleandata(xye) xe=xye(:,1) ye=xye(:,2) [nx,mx]=size(xe);// adjusting the x and y size [ny,my]=size(ye); N=min(nx,ny); xe=xe(1:N,:); ye=ye(1:N,:); // checking for NULL data for i=1:N if (xe(i)<>xe(i)) then xinfo('x contains no data:x('+string(i)+')'); return; end if (ye(i)<>ye(i)) then xinfo('Y contains no data:y('+string(i)+')'); return; end end zz=find(xe<0);xe(zz)=[];ye(zz)=[] if (find(xe==0)==[]) then // add zero point xe($+1)=0; ye($+1)=0; end [xo,k2]=gsort(xe,'r','i'); yo=ye(k2) xyo=[xo,yo]; endfunction //--------------------------------------------------------------- function [orpar,oipar]=AutoScale(a,xy,inipar,inrpar) drawlater(); oipar=inipar orpar=inrpar points=a.children(2).children splines=a.children(1).children points.data=xy; splines.data=xy; [orpar,oipar]=drawSplin(a,xy,oipar,orpar); rectx=findrect(a); a.data_bounds=rectx; show_pixmap(); drawnow() endfunction //============================ function METHOD=getmethod(order) select order case 0 then, METHOD='zero order' case 1 then, METHOD='linear' case 2 then, METHOD='order 2' case 3 then, METHOD='not_a_knot' case 4 then, METHOD='periodic' case 5 then, METHOD='monotone' case 6 then, METHOD='fast' case 7 then, METHOD='clamped' end endfunction //======================================= function [sok,xye]=ReadFromFile() xye=[];sok=%f; while %t [sok,filen,Cformat,Cx,Cy]=getvalue('Text data file ',['Filename';'Reading [C] f"+... "ormat';'Abscissa column';'Output"+... " column'],list('str',1,'str',1,'vec',1,'vec',1), ... list(['mydatafile.dat'],['%g %g'],['1'],['2'])); if ~sok then break,end px=strindex(Cformat,'%'); NC=size(px,'*'); if NC==[] then, xinfo('Bad format in reading data file');sok=%f;break;end Lx=[]; try fd=mopen(filen,'r'); Lx=mfscanf(-1,fd,Cformat); mclose(fd); catch xinfo('Scicos canot open the data file:'+filen); break; end [nD,mD]=size(Lx); if ((mD==0) | (nD==0)) then, xinfo('No data read');sok=%f;break;end if (mD<>NC) then, xinfo('Bad format');sok=%f;break;end xe=Lx(:,Cx);ye=Lx(:,Cy); xye=[xe,ye]; [xye]=cleandata(xye) sok=%t;break, end endfunction //======================================= function [sok]=SaveToFile(xye) xe=xye(:,1) ye=xye(:,2) sok=%f; while %t [sok,filen,Cformat]=getvalue('Text data file ',['Filename';'Writing [C] f"+... "ormat'],list('str',1,'str',1), ... list(['mydatafile.dat'],['%g %g'])); if ~sok then break,end px=strindex(Cformat,'%'); NC=size(px,'*'); if NC<>2 then, xinfo('Bad format in writing data file');sok=%f;break;end Cformat=Cformat+'\n'; try fd=mopen(filen,'w'); mfprintf(fd,Cformat,xe,ye); mclose(fd); catch xinfo('Scicos canot open the data file:'+filen); break; end sok=%t;break, end endfunction //========================================================= function [X,Y,orpar]=Do_Spline(N,order,x,y) X=[];Y=[];orpar=[]; METHOD=getmethod(order); if (METHOD=='zero order') then X=x(1);Y=y(1); for i=1:N-1 X=[X;x(i);x(i+1);x(i+1)]; Y=[Y;y(i);y(i);y(i+1)]; end return end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (METHOD=='linear') then X=[]; for i=1:N X=[X;x(i)]; Y=[Y;y(i)]; end return end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (N<25) then NP=10;else if (N<50) then NP=5;else if (N<100) then NP=2;else if (N<200) then NP=1;else NP=0;end;end;end; end for i=1:N-1 X=[X;linspace(x(i),x(i+1),NP+2)']; // pour tous sauf "linear" et "zero order" end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (N>2) & (METHOD=='order 2') then Z=ORDER2(x,y); A=Z(1:N-1); B=Z(N:2*N-2); C=Z(2*N-1:3*N-3); for j=1:size(X,'*') for i=N-1:-1:1 if X(j)>=x(i) then,break;end end Y(j)=A(i)*(X(j)-x(i))^2+B(i)*(X(j)-x(i))+C(i); end orpar=matrix(Z,-1,1) end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (METHOD=='not_a_knot') then try d = splin(x, y, METHOD); Y = interp(X, x, y, d); orpar=d(:); catch xinfo('ERROR in SPLINE: '+METHOD) end end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (METHOD=='periodic') then if y(1)<>y(N) then y(N)=y(1) end try d = splin(x, y,METHOD); Y = interp(X, x, y, d); orpar=d(:); catch xinfo('ERROR in SPLINE: '+METHOD) end end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (METHOD=='monotone' ) then try d = splin(x, y, METHOD); Y = interp(X, x, y, d); orpar=d(:); catch xinfo('ERROR in SPLINE: '+METHOD) end end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (METHOD=='fast') then try d = splin(x, y, METHOD); Y = interp(X, x, y, d); orpar=d(:); catch xinfo('ERROR in SPLINE: '+METHOD) end end //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (METHOD=='clamped') then try d = splin(x, y, METHOD,[0;0]); Y = interp(X, x, y, d); orpar=d(:); catch xinfo('ERROR in SPLINE: '+METHOD) end end endfunction //================================================= function [Z]=ORDER2(x,y) N=size(x,'*')-1; A=zeros(3*N-1,N*3); B=zeros(3*N-1,1); for i=1:N j=3*(i-1)+1; A(j,i+2*N)=1; B(j)=y(i); A(j+1,i)=(x(i+1)-x(i))^2; A(j+1,i+N)=x(i+1)-x(i); A(j+1,i+2*N)=1; B(j+1)=y(i+1); end for i=1:N-1 j=3*(i-1)+1; A(j+2,i)=2*(x(i+1)-x(i)); A(j+2,i+N)=1; A(j+2,i+N+1)=-1; end Q=zeros(3*N,3*N); for i=1:N Q(i,i)=4*(x(i+1)-x(i))^2 Q(i,i+N)=2*(x(i+1)-x(i)) Q(i+N,i)=2*(x(i+1)-x(i)) Q(i+N,i+N)=1; end At=[Q,A';A,zeros(3*N-1,3*N-1)] Bt=[zeros(3*N,1);B] Zt=At\Bt; Z=Zt(1:3*N,1) endfunction //===================================================