* API change on the scicos_block4 interface ; let the uid value be available 08/12308/4
Clément DAVID [Tue, 20 Aug 2013 13:39:27 +0000 (15:39 +0200)]
  inside simulation function.

Change-Id: Ia6963b2bcabea8b2ef663cbefb52afb10fd5176a

24 files changed:
scilab/CHANGES_5.5.X
scilab/modules/scicos/includes/import.h
scilab/modules/scicos/includes/scicos.h
scilab/modules/scicos/macros/scicos_scicos/c_pass2.sci
scilab/modules/scicos/macros/scicos_scicos/compile_modelica.sci
scilab/modules/scicos/macros/scicos_scicos/scicos_model.sci
scilab/modules/scicos/macros/scicos_scicos/scicos_sim.sci
scilab/modules/scicos/sci_gateway/c/sci_callblk.c
scilab/modules/scicos/sci_gateway/c/sci_model2blk.c
scilab/modules/scicos/sci_gateway/c/sci_scicosim.c
scilab/modules/scicos/src/c/createblklist.c
scilab/modules/scicos/src/c/import.c
scilab/modules/scicos/src/c/sciblk4.c
scilab/modules/scicos/src/c/scicos.c
scilab/modules/scicos/src/c/scicos_internal.h [new file with mode: 0644]
scilab/modules/scicos_blocks/includes/scicos_block.h
scilab/modules/scicos_blocks/includes/scicos_block4.h
scilab/modules/xcos/help/en_US/programming_scicos_blocks/c_computational_functions/C_struct.xml
scilab/modules/xcos/help/en_US/programming_scicos_blocks/scilab_computational_functions/sci_struct.xml
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/BasicBlock.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/SuperBlock.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/XcosDiagram.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/codec/BasicBlockCodec.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/io/scicos/BlockModelElement.java

index 23e2985..83f629d 100644 (file)
@@ -129,6 +129,9 @@ Xcos
 
 * JGraphX updated to the "2.1.0.7" version, updating our performance hooks.
 
+* API changed in the scicos_block4 interface: the uid value is not available
+  inside the simulation function.
+
 * Bug #7350 fixed - The I/O ports numbering of a superblock was not updated
                     when a new port was dropped.
 
index 7bed98e..cf9efba 100644 (file)
@@ -35,79 +35,81 @@ typedef struct
 
 typedef struct
 {
-    double* x;            /* 1  - continuous state */
-    int *nx;          /* 2  - length of continuous state  */
-    int * xptr;        /* 3  - vector of pointers on block states */
-    int * zcptr;       /* 4  - vector of pointers on block zero crosses */
-    double* z;            /* 5  - discrete state */
-    int *nz;          /* 6  - length of discrete state */
-    int* zptr;        /* 7  - vector of pointers on block states */
-    int *noz;         /* 8  - scalar number of object discrete states */
-    void **oz;            /* 9  - pointer array of object discrete states */
-    int *ozsz;        /* 10 - vector of dimension of object discrete states */
-    int *oztyp;       /* 11 - vector of type of object discrete states */
-    int *ozptr;       /* 12 - vector of pointers on object discrete states */
-    double* g;            /* 13 - zero crossing state */
-    int *ng;          /* 14 - length of zero crossing register */
-    int* mod;         /* 15 - modes of the blocks */
-    int *nmod;        /* 16 - length of mod register */
-    int* modptr;      /* 17 - vector of pointers */
-    int* iz;          /* 18 - vectors of labels */
-    int* izptr;       /* 19 - vector of pointers on block labels */
-    int* inpptr;      /* 20 - vector of pointers on block inputs */
-    int* inplnk;      /* 21 - vector of pointers on input link */
-    int* outptr;      /* 22 - vector of pointers on block outputs */
-    int* outlnk;      /* 23 - vector of pointers on output link */
-    double * rpar;        /* 24 - vector of real parameters */
-    int* rpptr;       /* 25 - vector of pointers on block real parameters */
-    int* ipar;        /* 26 - vector of integer parameters */
-    int* ipptr;       /* 27 - vector of pointers on block integer parameters */
-    void **opar;          /* 28 - pointer array of object parameters */
-    int *oparsz;      /* 29 - vector of dimension of object parameters */
-    int *opartyp;     /* 30 - vector of type of object parameters */
-    int *opptr;       /* 31 - vector of pointers on object parameters */
-    int *nblk;        /* 32 - number of  blocks */
-    void **outtbptr;      /* 33 - vector of pointer of object of outtb */
-    int *outtbsz;     /* 34 - vector of size of object of outtb */
-    int *outtbtyp;    /* 35 - vector of type of object of outtb */
-    int *nlnk;        /* 36 - number of object of outtb */
-    int* subs;        /* 37 -  */
-    int *nsubs;       /* 38 -  */
-    double* tevts;        /* 39 -  */
-    int* evtspt;      /* 40 -  */
-    int *nevts;       /* 41 -  */
-    int *pointi;      /* 42 -  */
-    int *iord;        /* 43 -  */
-    int *niord;       /* 44 -  */
-    int *oord;        /* 45 -  */
-    int *noord;       /* 46 -  */
-    int *zord;        /* 47 -  */
-    int *nzord;       /* 48 -  */
-    int *funptr;      /* 49 - block indexes */
-    int *funtyp;      /* 50 - block types */
-    int *ztyp;        /* 51 - block types */
-    int *cord;        /* 52 - block types */
-    int *ncord;       /* 53 - */
-    int *ordclk;      /* 54 - block types */
-    int *nordclk;     /* 55 - size of ordclk */
-    int *clkptr;      /* 56 - block types */
-    int *ordptr;      /* 57 - block types */
-    int *nordptr;     /* 58 - */
-    int *critev;      /* 59 - block types */
-    int *iwa;         /* 60 - integer work space of size nevts */
-    int *mask;        /* 61 - integer work space ng for mask */
-    scicos_block *blocks; /* 62 - scicos_block structure ptr */
-    double *t0;           /* 63 - scalar initial time of simulation  */
-    double *tf;           /* 64 - scalar final time of simulation    */
-    double *Atol;         /* 65 - scalar absolute tolerance of solvers of diff. equa. */
-    double *rtol;         /* 66 - scalar relative tolerance of solvers of diff. equa. */
-    double *ttol;         /* 67 - scalar time tolerance of solvers of diff. equa. */
-    double *deltat;       /* 68 - deltat */
-    double *hmax;         /* 69 - hmax */
-    outtb_el *outtb_elem; /* 70 - table (of size 2) coding each indexes of element of matrix in a same array */
-    int *nelem;       /* 71 - total unit element */
-    int *xprop;       /* 72 - xproperties (of size nx) */
-    double *xd;           /* 73 - derivative of continuous state */
+    double* x;            /* continuous state */
+    int *nx;          /* length of continuous state  */
+    int * xptr;        /* vector of pointers on block states */
+    int * zcptr;       /* vector of pointers on block zero crosses */
+    double* z;            /* discrete state */
+    int *nz;          /* length of discrete state */
+    int* zptr;        /* vector of pointers on block states */
+    int *noz;         /* scalar number of object discrete states */
+    void **oz;            /* pointer array of object discrete states */
+    int *ozsz;        /* vector of dimension of object discrete states */
+    int *oztyp;       /* vector of type of object discrete states */
+    int *ozptr;       /* vector of pointers on object discrete states */
+    double* g;            /* zero crossing state */
+    int *ng;          /* length of zero crossing register */
+    int* mod;         /* modes of the blocks */
+    int *nmod;        /* length of mod register */
+    int* modptr;      /* vector of pointers */
+    int* iz;          /* vectors of labels */
+    int* izptr;       /* vector of pointers on block labels */
+    int* uid;         /* vectors of uids */
+    int* uidptr;      /* vector of pointers on block uids */
+    int* inpptr;      /* vector of pointers on block inputs */
+    int* inplnk;      /* vector of pointers on input link */
+    int* outptr;      /* vector of pointers on block outputs */
+    int* outlnk;      /* vector of pointers on output link */
+    double * rpar;        /* vector of real parameters */
+    int* rpptr;       /* vector of pointers on block real parameters */
+    int* ipar;        /* vector of integer parameters */
+    int* ipptr;       /* vector of pointers on block integer parameters */
+    void **opar;          /* pointer array of object parameters */
+    int *oparsz;      /* vector of dimension of object parameters */
+    int *opartyp;     /* vector of type of object parameters */
+    int *opptr;       /* vector of pointers on object parameters */
+    int *nblk;        /* number of  blocks */
+    void **outtbptr;      /* vector of pointer of object of outtb */
+    int *outtbsz;     /* vector of size of object of outtb */
+    int *outtbtyp;    /* vector of type of object of outtb */
+    int *nlnk;        /* number of object of outtb */
+    int* subs;        /*  */
+    int *nsubs;       /*  */
+    double* tevts;        /*  */
+    int* evtspt;      /*  */
+    int *nevts;       /*  */
+    int *pointi;      /*  */
+    int *iord;        /*  */
+    int *niord;       /*  */
+    int *oord;        /*  */
+    int *noord;       /*  */
+    int *zord;        /*  */
+    int *nzord;       /*  */
+    int *funptr;      /* block indexes */
+    int *funtyp;      /* block types */
+    int *ztyp;        /* block types */
+    int *cord;        /* block types */
+    int *ncord;       /* */
+    int *ordclk;      /* block types */
+    int *nordclk;     /* size of ordclk */
+    int *clkptr;      /* block types */
+    int *ordptr;      /* block types */
+    int *nordptr;     /* */
+    int *critev;      /* block types */
+    int *iwa;         /* integer work space of size nevts */
+    int *mask;        /* integer work space ng for mask */
+    scicos_block *blocks; /* scicos_block structure ptr */
+    double *t0;           /* scalar initial time of simulation  */
+    double *tf;           /* scalar final time of simulation    */
+    double *Atol;         /* scalar absolute tolerance of solvers of diff. equa. */
+    double *rtol;         /* scalar relative tolerance of solvers of diff. equa. */
+    double *ttol;         /* scalar time tolerance of solvers of diff. equa. */
+    double *deltat;       /* deltat */
+    double *hmax;         /* hmax */
+    outtb_el *outtb_elem; /* table (of size 2) coding each indexes of element of matrix in a same array */
+    int *nelem;       /* total unit element */
+    int *xprop;       /* xproperties (of size nx) */
+    double *xd;           /* derivative of continuous state */
 } ScicosImport;
 
 SCICOS_IMPEXP ScicosImport* getscicosimportptr(void);
index 2422ea2..544fa2c 100644 (file)
@@ -108,6 +108,8 @@ typedef struct
  * @param ozptr
  * @param iz
  * @param izptr
+ * @param uid the uid values (stack formatted)
+ * @param uidptr the uid length : uid_length = uidptr($+1) - uidptr($)
  * @param t0_in
  * @param tf_in
  * @param tevts_in
@@ -160,7 +162,7 @@ typedef struct
 int C2F(scicos) (double *x_in, int *xptr_in, double *z__,
                  void **work, int *zptr, int *modptr_in,
                  void **oz, int *ozsz, int *oztyp, int *ozptr,
-                 int *iz, int *izptr, double *t0_in,
+                 int *iz, int *izptr, int *uid, int *uidptr, double *t0_in,
                  double *tf_in, double *tevts_in, int *evtspt_in,
                  int *nevts, int *pointi_in, void **outtbptr_in,
                  int *outtbsz_in, int *outtbtyp_in,
index 415a9d9..62d1fe5 100644 (file)
@@ -114,7 +114,7 @@ function cpr=c_pass2(bllst,connectmat,clkconnect,cor,corinv,flag)
     //extract various info from bllst
     [lnksz,lnktyp,inplnk,outlnk,clkptr,cliptr,inpptr,outptr,xptr,zptr,..
     ozptr,typ_mod,rpptr,ipptr,opptr,xc0,xcd0,xd0,oxd0,rpar,..
-    ipar,opar,typ_z,typ_x,typ_m,funs,funtyp,initexe,labels,..
+    ipar,opar,typ_z,typ_x,typ_m,funs,funtyp,initexe,labels,uids,..
     bexe,boptr,blnk,blptr,ok]=extract_info(bllst,connectmat,clkconnect,typ_l);
     typ_z0=typ_z;
 
@@ -166,7 +166,7 @@ function cpr=c_pass2(bllst,connectmat,clkconnect,cor,corinv,flag)
     // utiliser pour la generation de code
 
     if xptr($)==1 & zcptr($)>1 then
-        mess=msprintf(_("No continuous-time state. Thresholds are ignored; this \nmay be OK if you don''t generate external events with them.\nIf you want to reactivate the thresholds, then you need\nto include a block with continuous-time state in your diagram.\n   You can for example include DUMMY CLSS block (linear palette)."))
+        mess=msprintf(_("No continuous-time state. Thresholds are ignored; this \nmay be OK if you don''t generate external events with them.\nIf you want to reactivate the thresholds, the you need\n\nto include a block with continuous-time state in your diagram.\n   You can for example include DUMMY CLSS block (linear palette)."))
         messagebox(mess,"modal","error");
     end
 
@@ -180,7 +180,7 @@ function cpr=c_pass2(bllst,connectmat,clkconnect,cor,corinv,flag)
     ordclk=ordclk,cord=cord,oord=oord,zord=zord,..
     critev=critev(:),nb=nb,ztyp=ztyp,nblk=nblk,..
     ndcblk=ndcblk,subscr=subscr,funtyp=funtyp,..
-    iord=iord,labels=labels,modptr=modptr);
+    iord=iord,labels=labels,uids=uids,modptr=modptr);
 
     //initialize agenda
     [tevts,evtspt,pointi]=init_agenda(initexe,clkptr)
@@ -197,7 +197,7 @@ function cpr=c_pass2(bllst,connectmat,clkconnect,cor,corinv,flag)
         warning(_("Diagram contains implicit blocks, compiling for implicit Solver."))
         %scicos_solver=100
     end
-    if (or (%scicos_solver == [100 101 102])) then xc0=[xc0;xcd0],end
+    if %scicos_solver==100 then xc0=[xc0;xcd0],end
     state=scicos_state()
     state.x=xc0
     state.z=xd0
@@ -1154,7 +1154,7 @@ endfunction
 
 function [lnksz,lnktyp,inplnk,outlnk,clkptr,cliptr,inpptr,outptr,xptr,zptr,..
     ozptr,typ_mod,rpptr,ipptr,opptr,xc0,xcd0,xd0,oxd0,rpar,..
-    ipar,opar,typ_z,typ_x,typ_m,funs,funtyp,initexe,labels,..
+    ipar,opar,typ_z,typ_x,typ_m,funs,funtyp,initexe,labels,uids,..
     bexe,boptr,blnk,blptr,ok]=extract_info(bllst,connectmat,clkconnect,typ_l)
 
     ok=%t
@@ -1176,6 +1176,7 @@ function [lnksz,lnktyp,inplnk,outlnk,clkptr,cliptr,inpptr,outptr,xptr,zptr,..
     funs=list();
     funtyp=zeros(typ_z)
     labels=[]
+    uids=[]
     [ok,bllst]=adjust_inout(bllst,connectmat)
     if ok then
         [ok,bllst]=adjust_typ(bllst,connectmat)
@@ -1187,7 +1188,7 @@ function [lnksz,lnktyp,inplnk,outlnk,clkptr,cliptr,inpptr,outptr,xptr,zptr,..
         xptr=[],zptr=[],ozptr=[],rpptr=[],ipptr=[],opptr=[],xc0=[],..
         xcd0=[],xd0=[],oxd0=list(),rpar=[],ipar=[],opar=list(),..
         typ_z=[],typ_x=[],typ_m=[],funs=[],funtyp=[],initexe=[],..
-        labels=[],bexe=[],boptr=[],blnk=[],blptr=[]
+        labels=[],uids=[],bexe=[],boptr=[],blnk=[],blptr=[]
         return;
     end
     for i=1:nbl
@@ -1334,6 +1335,12 @@ function [lnksz,lnktyp,inplnk,outlnk,clkptr,cliptr,inpptr,outptr,xptr,zptr,..
         else
             labels=[labels;" "]
         end
+
+        if type(ll.uid)==10 then
+            uids=[uids;ll.uid(1)]
+        else
+            uids=[uids;" "]
+        end
     end
 
     clkconnect=clkconnect(find(clkconnect(:,1)<>0),:);
@@ -2605,3 +2612,4 @@ function [ok,bllst]=adjust_typ(bllst,connectmat)
         end
     end
 endfunction
+
index ea01076..40087cf 100644 (file)
@@ -114,7 +114,7 @@ function [ok,name,nipar,nrpar,nopar,nz,nx,nx_der,nx_ns,nin,nout,nm,ng,dep_u]=com
     [nipar,nrpar,nopar,nz,nx,nx_der,nx_ns,nin,nout,nm,ng,dep_u]=reading_incidence(incidence)
     depu(dep_u)="T";  depu(~dep_u)="F";depu=strcat(depu);
 
-    messagebox([_("Modelica blocks are reduced to a block with:") ;
+    txt = [_("Modelica blocks are reduced to a block with:") ;
     msprintf(_("Number of differential states: %d"),nx_der);
     msprintf(_("Number of algebraic states: %d"),nx-nx_der);
     msprintf(_("Number of discrete time states  : %d"),nz);
@@ -127,7 +127,13 @@ function [ok,name,nipar,nrpar,nopar,nz,nx,nx_der,nx_ns,nin,nout,nm,ng,dep_u]=com
     msprintf(_("Parameter embedding mode: enabled (%%Modelica_ParEmb=%s)"),sci2exp(%Modelica_ParEmb))
     ""
     msprintf(_("Generated files path: %s"),outpath)
-    ""],"info");
+    ""];
+
+    if getscilabmode() == "STD" then
+        messagebox(txt, "info");
+    else
+        disp(txt);
+    end
 
     //compile and link the generated C file
     ok=Link_modelica_C(Cfile)
index f4a4fd2..a0c4d87 100644 (file)
@@ -45,12 +45,12 @@ function model=scicos_model(v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v
     if exists("nzcross","local")==0 then nzcross=0,end
     if exists("nmode","local")==0 then nmode=0,end
     if exists("equations","local")==0 then equations=list(),end
+    if exists("uid","local")==0 then uid="",end
 
     model=mlist(["model","sim","in","in2","intyp","out","out2","outtyp",...
     "evtin","evtout","state","dstate","odstate","rpar","ipar","opar",...
     "blocktype","firing","dep_ut","label","nzcross",..
-    "nmode","equations"],..
+    "nmode","equations","uid"],..
     sim,in,in2,intyp,out,out2,outtyp,evtin,evtout,state,dstate,odstate,..
-    rpar,ipar,opar,blocktype,firing,dep_ut,label,nzcross,nmode,equations)
+    rpar,ipar,opar,blocktype,firing,dep_ut,label,nzcross,nmode,equations,uid)
 endfunction
-
index 9376ed1..3a32c72 100644 (file)
@@ -59,17 +59,17 @@ function sim=scicos_sim(v1,v2,v3,v4,v5,..
     if exists("iord","local")==0 then iord=[],end
     if exists("labels","local")==0 then labels=[],end
     if exists("modptr","local")==0 then modptr=[],end
+    if exists("uids","local")==0 then uids=[],end
     sim=tlist(["scs","funs","xptr","zptr","ozptr",..
     "zcptr","inpptr","outptr","inplnk","outlnk","rpar",..
     "rpptr","ipar","ipptr","opar","opptr",..
     "clkptr","ordptr","execlk","ordclk","cord","oord","zord",..
     "critev","nb","ztyp","nblk","ndcblk","subscr","funtyp",..
-    "iord","labels","modptr"],..
+    "iord","labels","modptr","uids"],..
     funs,xptr,zptr,ozptr,zcptr,inpptr,..
     outptr,inplnk,outlnk,rpar,rpptr,ipar,ipptr,..
     opar,opptr,clkptr,ordptr,..
     execlk,ordclk,cord,oord,zord,..
     critev,nb,ztyp,nblk,ndcblk,..
-    subscr,funtyp,iord,labels,modptr)
+    subscr,funtyp,iord,labels,modptr,uids)
 endfunction
-
index cc4e700..1cddd8a 100644 (file)
@@ -56,7 +56,7 @@ int sci_callblk(char *fname, unsigned long fname_len)
     int l_tmp = 0;
 
     /* length of the scilab list scicos struct */
-    int nblklst = 40;
+    int nblklst = 41;
 
     /* variable for callf */
     scicos_flag flag = 0;
@@ -172,6 +172,10 @@ int sci_callblk(char *fname, unsigned long fname_len)
             FREE(Block.label);
         }
         FREE(Block.mode);
+        if (strlen(Block.uid) != 0)
+        {
+            FREE(Block.uid);
+        }
         return 0;
     }
 
@@ -179,7 +183,7 @@ int sci_callblk(char *fname, unsigned long fname_len)
     il2 = (int *) GetData(2);
     m2  = il2[1];
     n2  = il2[2];
-    if ((il2[0] != 1) || (m2*n2 != 1))
+    if ((il2[0] != 1) || (m2 * n2 != 1))
     {
         Scierror(888, _("%s : Second argument must be scalar.\n"), fname);
         return 0;
@@ -191,7 +195,7 @@ int sci_callblk(char *fname, unsigned long fname_len)
     m3  = il3[1];
     n3  = il3[2];
 
-    if ((il3[0] != 1) || (m3*n3 != 1))
+    if ((il3[0] != 1) || (m3 * n3 != 1))
     {
         Scierror(888, _("%s : Third argument must be scalar.\n"), fname);
         return 0;
@@ -246,6 +250,10 @@ int sci_callblk(char *fname, unsigned long fname_len)
         FREE(Block.label);
     }
     FREE(Block.mode);
+    if (strlen(Block.uid) != 0)
+    {
+        FREE(Block.uid);
+    }
 
     Top = TopSave;
 
index 5e71de1..9ae7981 100644 (file)
@@ -2316,6 +2316,63 @@ int sci_model2blk(char *fname, unsigned long fname_len)
         }
     }
 
+    /* uids */
+    /* 23 : model.uid  */
+    n            = MlistGetFieldNumber(il1, "uid");
+    ilh          = (int *) (listentry(il1, n));
+    mh           = ilh[1];
+    nh           = ilh[2];
+    Block.uid  = "";
+    if (mh * nh != 0)
+    {
+        len_str  = ilh[5] - 1;
+        if (len_str != 0)
+        {
+            if ((Block.uid = (char *) MALLOC((len_str + 1) * sizeof(char))) == NULL)
+            {
+                for (j = 0; j < Block.nin; j++)
+                {
+                    FREE(Block.inptr[j]);
+                }
+                FREE(Block.inptr);
+                FREE(Block.insz);
+                for (j = 0; j < Block.nout; j++)
+                {
+                    FREE(Block.outptr[j]);
+                }
+                FREE(Block.outptr);
+                FREE(Block.outsz);
+                FREE(Block.evout);
+                FREE(Block.x);
+                FREE(Block.xd);
+                FREE(Block.xprop);
+                FREE(Block.res);
+                FREE(Block.z);
+                FREE(Block.ozsz);
+                FREE(Block.oztyp);
+                for (j = 0; j < Block.noz; j++)
+                {
+                    FREE(Block.ozptr[j]);
+                }
+                FREE(Block.rpar);
+                FREE(Block.ipar);
+                FREE(Block.oparsz);
+                FREE(Block.opartyp);
+                for (j = 0; j < Block.nopar; j++)
+                {
+                    FREE(Block.oparptr[j]);
+                }
+                FREE(Block.label);
+                FREE(Block.g);
+                FREE(Block.jroot);
+                Scierror(888, _("%s : Allocation error.\n"), fname);
+                return 0;
+            }
+            Block.uid[len_str] = '\0';
+            C2F(cvstr)(&len_str, &ilh[6], Block.uid, (j = 1, &j), len_str);
+        }
+    }
+
     /* work */
     if ((Block.work = (void **) MALLOC(sizeof(void *))) == NULL)
     {
index 8986d37..f6fad7c 100644 (file)
@@ -54,7 +54,7 @@
 *                         outptr inplnk  outlnk  rpar    rpptr   ipar    ipptr
 *                         opar   opptr   clkptr  ordptr  execlk  ordclk  cord
 *                         oord   zord    critev  nb      ztyp    nblk    ndcblk
-*                         subscr funtyp  iord    labels  modptr  !
+*                         subscr funtyp  iord    labels  modptr  uids !
 *        - 2  : sim.funs   : list of strings and/or scilab function
 *        - 3  : sim.xptr   : column vector of real
 *        - 4  : sim.zptr   : column vector of real
@@ -87,6 +87,7 @@
 *        - 31 : sim.iord   : column vector of real
 *        - 32 : sim.labels : column vector of strings
 *        - 33 : sim.modptr : column vector of real
+*        - 34 : sim.uids : column vector of strings
 *
 * rhs 5 str   : string flag : 'start','run','finish','linear'
 * rhs 6 tol   : real vector of size (7,1) minimum (4,1)
@@ -336,6 +337,10 @@ int sci_scicosim(char *fname, unsigned long fname_len)
     static int m_modptr = 0, n_modptr = 0;  /*sim.modptr*/
     static int *il_sim_modptr = NULL;
     static int *l_sim_modptr = NULL;
+    static int m_uid = 0, n_uid = 0;        /*sim.uids*/
+    static int *il_sim_uid = NULL;
+    static int *il_sim_uidptr = NULL;
+    static int *l_sim_uid = NULL;
 
     static int m5 = 0, n5 = 0;              /*str*/
     static int *il_str = NULL;
@@ -1646,6 +1651,13 @@ int sci_scicosim(char *fname, unsigned long fname_len)
         }
     }
 
+    /*34 : sim.uids */
+    il_sim_uid = (int *) (listentry(il_sim, 34));
+    m_uid = il_sim_uid[1];
+    n_uid = il_sim_uid[2];
+    il_sim_uidptr = &il_sim_uid[4];  /*get address-1 of first pointer in uids*/
+    l_sim_uid = (int *) (il_sim_uid + m_uid + 5); /*get address of first string in uids*/
+
     /*************
     * str (rhs 5)
     *************/
@@ -2464,7 +2476,7 @@ int sci_scicosim(char *fname, unsigned long fname_len)
     C2F(scicos)(l_state_x, l_sim_xptr, l_state_z,
                 l_state_iz, l_sim_zptr, l_sim_modptr,
                 oz, ozsz, oztyp, l_sim_ozptr,
-                l_sim_lab, il_sim_labptr, l_tcur,
+                l_sim_lab, il_sim_labptr, l_sim_uid, il_sim_uidptr, l_tcur,
                 l_tf, l_state_tevts, l_state_evtspt,
                 &m1e5, l_pointi, outtbptr,
                 outtbsz, outtbtyp,
index 09fe18e..410dd1f 100644 (file)
@@ -53,8 +53,6 @@ int createblklist(scicos_block *Blocks, int *ierr, int flag_imp, int funtyp)
     double *xd = NULL;
     double *g = NULL;
 
-    /* set length of block list -please update me-                           */
-    static int nblklst = 40;
     /* set string of first element of scilab Blocks tlist -please update me- */
     static char *str_blklst[] = { "scicos_block", "nevprt"  , "funpt" , "type"  ,
                                   "scsptr"      , "nz"      , "z"     , "noz"   ,
@@ -65,9 +63,13 @@ int createblklist(scicos_block *Blocks, int *ierr, int flag_imp, int funtyp)
                                   "rpar"        , "nipar"   , "ipar"  , "nopar" ,
                                   "oparsz"      , "opartyp" , "opar"  , "ng"    ,
                                   "g"           , "ztyp"    , "jroot" , "label" ,
-                                  "work"        , "nmode"   , "mode"  , "xprop"
+                                  "work"        , "nmode"   , "mode"  , "xprop" ,
+                                  "uid"
                                 };
 
+    /* auto length of block list */
+    static int nblklst = sizeof(str_blklst) / sizeof(str_blklst[0]);
+
     /* char ptr for str2sci - see below - */
     char **str1;
 
@@ -503,6 +505,26 @@ int createblklist(scicos_block *Blocks, int *ierr, int flag_imp, int funtyp)
         return 0;
     }
 
+    /* 41 - uid */
+    if ((str1 = MALLOC(sizeof(char*))) == NULL )
+    {
+        return 0;
+    }
+    if ((str1[0] = MALLOC(sizeof(char) * (strlen(Blocks[0].uid) + 1))) == NULL )
+    {
+        FREE(str1);
+        return 0;
+    }
+    (str1[0])[strlen(Blocks[0].uid)] = '\0';
+    strncpy(str1[0], Blocks[0].uid, strlen(Blocks[0].uid));
+    str2sci(str1, 1, 1);
+    FREE(str1[0]);
+    FREE(str1);
+    if (C2F(scierr)() != 0)
+    {
+        return 0;
+    }
+
     C2F(mktlist)(&nblklst); /*create Blocks list*/
     if (C2F(scierr)() != 0)
     {
index 9a12733..39b70fc 100644 (file)
 #include "machine.h"
 #include "import.h"
 #include "scicos.h"
+#include "scicos_internal.h"
 #include "cvstr.h"
 /*--------------------------------------------------------------------------*/
-extern struct
-{
-    int kfun;
-} C2F(curblk);
-
 ScicosImport scicos_imp =
 {
-    (double *)  NULL,      /* 1  - x      **  */
-    (int *) NULL,      /* 2  - nx         */
-    (int *) NULL,      /* 3  - xptr   **  */
-    (int *) NULL,      /* 4  - zcptr  **  */
-    (double *)  NULL,      /* 5  - z      **  */
-    (int *) NULL,      /* 6  - nz         */
-    (int *) NULL,      /* 7  - zptr   **  */
-    (int *) NULL,      /* 8  - noz        */
-    (void **)   NULL,      /* 9  - oz         */
-    (int *) NULL,      /* 10 - ozsz       */
-    (int *) NULL,      /* 11 - oztyp      */
-    (int *) NULL,      /* 12 - ozptr      */
-    (double *)  NULL,      /* 13 - g          */
-    (int *) NULL,      /* 14 - ng         */
-    (int *) NULL,      /* 15 - mod        */
-    (int *) NULL,      /* 16 - nmod       */
-    (int *) NULL,      /* 17 - modptr **  */
-    (int *) NULL,      /* 18 - iz         */
-    (int *) NULL,      /* 19 - izptr      */
-    (int *) NULL,      /* 20 - inpptr **  */
-    (int *) NULL,      /* 21 - inplnk **  */
-    (int *) NULL,      /* 22 - outptr **  */
-    (int *) NULL,      /* 23 - outlnk **  */
-    (double *)  NULL,      /* 24 - rpar   **  */
-    (int *) NULL,      /* 25 - rpptr  **  */
-    (int *) NULL,      /* 26 - ipar   **  */
-    (int *) NULL,      /* 27 - ipptr  **  */
-    (void **)   NULL,      /* 28 - opar       */
-    (int *) NULL,      /* 29 - oparsz     */
-    (int *) NULL,      /* 30 - opartyp    */
-    (int *) NULL,      /* 31 - opptr      */
-    (int *) NULL,      /* 32 - nblk       */
-    (void **)   NULL,      /* 33 - outtbptr   */
-    (int *) NULL,      /* 34 - outtbsz    */
-    (int *) NULL,      /* 35 - outtbtyp   */
-    (int *) NULL,      /* 36 - nlnk       */
-    (int *) NULL,      /* 37 - subs   **  */
-    (int *) NULL,      /* 38 - nsubs      */
-    (double *)  NULL,      /* 39 - tevts  **  */
-    (int *) NULL,      /* 40 - evtspt **  */
-    (int *) NULL,      /* 41 - nevts      */
-    (int *) NULL,      /* 42 - pointi **  */
-    (int *) NULL,      /* 43 - iord   **  */
-    (int *) NULL,      /* 44 - niord      */
-    (int *) NULL,      /* 45 - oord   **  */
-    (int *) NULL,      /* 46 - noord      */
-    (int *) NULL,      /* 47 - zord   **  */
-    (int *) NULL,      /* 48 - nzord      */
-    (int *) NULL,      /* 49 - funptr     */
-    (int *) NULL,      /* 50 - funtyp **  */
-    (int *) NULL,      /* 51 - ztyp   **  */
-    (int *) NULL,      /* 52 - cord   **  */
-    (int *) NULL,      /* 53 - ncord      */
-    (int *) NULL,      /* 54 - ordclk **  */
-    (int *) NULL,      /* 55 - nordclk ** */
-    (int *) NULL,      /* 56 - clkptr **  */
-    (int *) NULL,      /* 57 - ordptr **  */
-    (int *) NULL,      /* 58 - nordptr    */
-    (int *) NULL,      /* 59 - critev **  */
-    (int *) NULL,      /* 60 - iwa        */
-    (int *) NULL,      /* 61 - mask       */
-    (scicos_block *) NULL, /* 62 - blocks     */
-    (double *)  NULL,      /* 63 - t0         */
-    (double *)  NULL,      /* 64 - tf         */
-    (double *)  NULL,      /* 65 - Atol       */
-    (double *)  NULL,      /* 66 - rtol       */
-    (double *)  NULL,      /* 67 - ttol       */
-    (double *)  NULL,      /* 68 - deltat     */
-    (double *)  NULL,      /* 69 - hmax       */
-    (outtb_el *) NULL,     /* 70 - outtb_elem */
-    (int *) NULL,      /* 71 - nelem      */
-    (int *) NULL,      /* 72 - xprop      */
-    (double *)  NULL,      /* 73 - xd         */
+    (double *)  NULL,      /* x      **  */
+    (int *) NULL,      /* nx         */
+    (int *) NULL,      /* xptr   **  */
+    (int *) NULL,      /* zcptr  **  */
+    (double *)  NULL,      /* z      **  */
+    (int *) NULL,      /* nz         */
+    (int *) NULL,      /* zptr   **  */
+    (int *) NULL,      /* noz        */
+    (void **)   NULL,      /* oz         */
+    (int *) NULL,      /* ozsz       */
+    (int *) NULL,      /* oztyp      */
+    (int *) NULL,      /* ozptr      */
+    (double *)  NULL,      /* g          */
+    (int *) NULL,      /* ng         */
+    (int *) NULL,      /* mod        */
+    (int *) NULL,      /* nmod       */
+    (int *) NULL,      /* modptr **  */
+    (int *) NULL,      /* iz         */
+    (int *) NULL,      /* izptr      */
+    (int *) NULL,      /* uid        */
+    (int *) NULL,      /* uidptr     */
+    (int *) NULL,      /* inpptr **  */
+    (int *) NULL,      /* inplnk **  */
+    (int *) NULL,      /* outptr **  */
+    (int *) NULL,      /* outlnk **  */
+    (double *)  NULL,      /* rpar   **  */
+    (int *) NULL,      /* rpptr  **  */
+    (int *) NULL,      /* ipar   **  */
+    (int *) NULL,      /* ipptr  **  */
+    (void **)   NULL,      /* opar       */
+    (int *) NULL,      /* oparsz     */
+    (int *) NULL,      /* opartyp    */
+    (int *) NULL,      /* opptr      */
+    (int *) NULL,      /* nblk       */
+    (void **)   NULL,      /* outtbptr   */
+    (int *) NULL,      /* outtbsz    */
+    (int *) NULL,      /* outtbtyp   */
+    (int *) NULL,      /* nlnk       */
+    (int *) NULL,      /* subs   **  */
+    (int *) NULL,      /* nsubs      */
+    (double *)  NULL,      /* tevts  **  */
+    (int *) NULL,      /* evtspt **  */
+    (int *) NULL,      /* nevts      */
+    (int *) NULL,      /* pointi **  */
+    (int *) NULL,      /* iord   **  */
+    (int *) NULL,      /* niord      */
+    (int *) NULL,      /* oord   **  */
+    (int *) NULL,      /* noord      */
+    (int *) NULL,      /* zord   **  */
+    (int *) NULL,      /* nzord      */
+    (int *) NULL,      /* funptr     */
+    (int *) NULL,      /* funtyp **  */
+    (int *) NULL,      /* ztyp   **  */
+    (int *) NULL,      /* cord   **  */
+    (int *) NULL,      /* ncord      */
+    (int *) NULL,      /* ordclk **  */
+    (int *) NULL,      /* nordclk ** */
+    (int *) NULL,      /* clkptr **  */
+    (int *) NULL,      /* ordptr **  */
+    (int *) NULL,      /* nordptr    */
+    (int *) NULL,      /* critev **  */
+    (int *) NULL,      /* iwa        */
+    (int *) NULL,      /* mask       */
+    (scicos_block *) NULL, /* blocks     */
+    (double *)  NULL,      /* t0         */
+    (double *)  NULL,      /* tf         */
+    (double *)  NULL,      /* Atol       */
+    (double *)  NULL,      /* rtol       */
+    (double *)  NULL,      /* ttol       */
+    (double *)  NULL,      /* deltat     */
+    (double *)  NULL,      /* hmax       */
+    (outtb_el *) NULL,     /* outtb_elem */
+    (int *) NULL,      /* nelem      */
+    (int *) NULL,      /* xprop      */
+    (double *)  NULL,      /* xd         */
 };
 
 /*--------------------------------------------------------------------------*/
@@ -117,25 +115,25 @@ ScicosImport* getscicosimportptr(void)
     return &scicos_imp;
 }
 /*--------------------------------------------------------------------------*/
-void C2F(makescicosimport)(double *x, int *nx,
-                           int *xptr, int *zcptr,
-                           double *z, int *nz, int *zptr,
-                           int *noz, void **oz, int *ozsz, int *oztyp, int *ozptr,
-                           double *g, int *ng,
-                           int *mod, int *nmod, int *modptr,
-                           int *iz, int *izptr, int *inpptr, int *inplnk,
-                           int *outptr, int *outlnk, void **outtbptr, int *outtbsz, int *outtbtyp,
-                           outtb_el *outtb_elem, int *nelem,
-                           int *nlnk, double *rpar, int *rpptr, int *ipar, int *ipptr,
-                           void **opar, int *oparsz, int *opartyp, int *opptr,
-                           int *nblk, int *subs, int *nsubs,
-                           double *tevts, int *evtspt, int *nevts, int *pointi,
-                           int *iord, int *niord, int *oord, int *noord, int *zord, int *nzord,
-                           int *funptr, int *funtyp, int *ztyp,
-                           int *cord, int *ncord, int *ordclk, int *nordclk, int *clkptr,
-                           int *ordptr, int *nordptr, int *critev,  int *iwa, scicos_block *blocks,
-                           double *t0, double *tf, double *Atol, double *rtol, double *ttol, double *deltat, double *hmax,
-                           int *xprop, double *xd)
+void makescicosimport(double *x, int *nx,
+                      int *xptr, int *zcptr,
+                      double *z, int *nz, int *zptr,
+                      int *noz, void **oz, int *ozsz, int *oztyp, int *ozptr,
+                      double *g, int *ng,
+                      int *mod, int *nmod, int *modptr,
+                      int *iz, int *izptr, int *uid, int *uidptr, int *inpptr, int *inplnk,
+                      int *outptr, int *outlnk, void **outtbptr, int *outtbsz, int *outtbtyp,
+                      outtb_el *outtb_elem, int *nelem,
+                      int *nlnk, double *rpar, int *rpptr, int *ipar, int *ipptr,
+                      void **opar, int *oparsz, int *opartyp, int *opptr,
+                      int *nblk, int *subs, int *nsubs,
+                      double *tevts, int *evtspt, int *nevts, int *pointi,
+                      int *iord, int *niord, int *oord, int *noord, int *zord, int *nzord,
+                      int *funptr, int *funtyp, int *ztyp,
+                      int *cord, int *ncord, int *ordclk, int *nordclk, int *clkptr,
+                      int *ordptr, int *nordptr, int *critev,  int *iwa, scicos_block *blocks,
+                      double *t0, double *tf, double *Atol, double *rtol, double *ttol, double *deltat, double *hmax,
+                      int *xprop, double *xd)
 {
     scicos_imp.x = x;
     scicos_imp.nx = nx;
@@ -158,6 +156,8 @@ void C2F(makescicosimport)(double *x, int *nx,
     scicos_imp.modptr = modptr;
     scicos_imp.iz = iz;
     scicos_imp.izptr = izptr;
+    scicos_imp.uid = uid;
+    scicos_imp.uidptr = uidptr;
 
     scicos_imp.inpptr = inpptr;
     scicos_imp.inplnk = inplnk;
@@ -247,6 +247,8 @@ void C2F(clearscicosimport)()
     scicos_imp.modptr = (int *) NULL;
     scicos_imp.iz = (int *) NULL;
     scicos_imp.izptr = (int *) NULL;
+    scicos_imp.uid = (int *) NULL;
+    scicos_imp.uidptr = (int *) NULL;
 
     scicos_imp.inpptr = (int *) NULL;
     scicos_imp.inplnk = (int *) NULL;
@@ -325,7 +327,7 @@ int getscicosvarsfromimport(char *what, void **v, int *nv, int *mv)
 /*int *mv; size 1 of the imported data */
 {
     /*variable declaration*/
-    int nx, nmod, nblk, nlnk, nsubs, nevts, ng;
+    int nx, nz, noz, nmod, nblk, nlnk, nsubs, nevts, ng;
     int niord, noord, ncord, nordptr, nzord, nelem;
 
     /*test if scicosim is running*/
@@ -337,6 +339,10 @@ int getscicosvarsfromimport(char *what, void **v, int *nv, int *mv)
 
     /* retrieve length of x register */
     nx = (int) scicos_imp.nx[0];
+    /* retrieve length of z register */
+    nz = (int) scicos_imp.nz[0];
+    /* retrieve length of oz register */
+    noz = (int) scicos_imp.noz[0];
     /* retrieve number of block */
     nmod = (int) scicos_imp.nmod[0];
     /* retrieve number of block */
@@ -482,6 +488,20 @@ int getscicosvarsfromimport(char *what, void **v, int *nv, int *mv)
         *mv = 1;
         *v  = (int *) (scicos_imp.izptr);
     }
+    else if (strcmp(what, "uid") == 0)
+    {
+        /* uid */
+        *nv = (int)(scicos_imp.uidptr[nblk] - scicos_imp.uidptr[0]);
+        *mv = 1;
+        *v  = (int *) (scicos_imp.uid);
+    }
+    else if (strcmp(what, "uidptr") == 0)
+    {
+        /* uidptr */
+        *nv = nblk + 1;
+        *mv = 1;
+        *v  = (int *) (scicos_imp.uidptr);
+    }
     else if (strcmp(what, "inpptr") == 0)
     {
         /* inpptr */
@@ -751,14 +771,14 @@ int getscicosvarsfromimport(char *what, void **v, int *nv, int *mv)
     else if (strcmp(what, "critev") == 0)
     {
         /* */
-        *nv = (int)(scicos_imp.clkptr[nblk] - 1); /* !! à faire vérifier !! */
+        *nv = (int)(scicos_imp.clkptr[nblk] - 1); /* !! a faire verifier !! */
         *mv = 1;
         *v  = (int *) (scicos_imp.critev);
     }
     else if (strcmp(what, "iwa") == 0)
     {
         /* */
-        *nv = nevts; /* !! à faire vérifier !! */
+        *nv = nevts; /* !! a faire verifier !! */
         *mv = 1;
         *v  = (int *) (scicos_imp.iwa);
     }
@@ -987,7 +1007,7 @@ void C2F(getouttb)(int *nsize, int *nvec, double *outtc)
     outtb_el *outtb_elem;       /*to store ptr of outtb_elem structure */
 
     /*auxiliary variable*/
-    int j, lnk, pos;
+    int j, sz, lnk, pos;
 
     /*get outtbptr from import struct.*/
     outtbptr = scicos_imp.outtbptr;
@@ -1024,6 +1044,7 @@ void C2F(getouttb)(int *nsize, int *nvec, double *outtc)
         /*complex data type*/
         else if (outtbtyp == SCSCOMPLEX_N)
         {
+            sz = outtbsz[2 * lnk] + outtbsz[(2 * lnk) + 1];
             outtbdptr = (SCSCOMPLEX_COP *)outtbptr[lnk];
             outtc[j] =  (double)outtbdptr[pos];
             /*outtc[j+1] =  (double)outtbdptr[pos+sz];*/
index 8aa51fe..bca0968 100644 (file)
@@ -658,7 +658,7 @@ err:
 static int sci2var(void *x, void *y, int typ_var)
 {
     /************************************
-     * variables and constants définition
+     * variables and constants definition
      ************************************/
     /* counter and address variable declaration */
     int err, i, j;
index 5dfd23c..7c4386f 100644 (file)
@@ -63,6 +63,7 @@
 #include "sciprint.h"
 #include "scicos.h"
 #include "import.h"
+#include "scicos_internal.h"
 #include "blocks.h"
 #include "core_math.h"
 #include "storeCommand.h"
@@ -275,9 +276,6 @@ extern int C2F(dcopy)(int *, double *, int *, double *, int *);
 extern int C2F(dgefa)(double *A, int *lead_dim_A, int *n, int *ipivots, int *info);
 extern int C2F(dgesl)(double *A, int *lead_dim_A, int *n, int *ipivots, double *B, int *job);
 extern int C2F(msgs)();
-extern int C2F(getscsmax)();
-extern int C2F(makescicosimport)();
-extern int C2F(clearscicosimport)();
 /*--------------------------------------------------------------------------*/
 void putevs(double *t, int *evtnb, int *ierr1);
 void Jdoit(double *told, double *xt, double *xtd, double *residual, int *job);
@@ -286,7 +284,7 @@ int simblkKinsol(N_Vector yy, N_Vector resval, void *rdata);
 int C2F(scicos)(double *x_in, int *xptr_in, double *z__,
                 void **work, int *zptr, int *modptr_in,
                 void **oz, int *ozsz, int *oztyp, int *ozptr,
-                int *iz, int *izptr, double *t0_in,
+                int *iz, int *izptr, int* uid, int* uidptr, double *t0_in,
                 double *tf_in, double *tevts_in, int *evtspt_in,
                 int *nevts, int *pointi_in, void **outtbptr_in,
                 int *outtbsz_in, int *outtbtyp_in,
@@ -529,7 +527,7 @@ int C2F(scicos)(double *x_in, int *xptr_in, double *z__,
             switch (funtyp[kf + 1])
             {
                 case 0:
-                    Blocks[kf].funpt = F2C(sciblk);
+                    Blocks[kf].funpt = (voidg) F2C(sciblk);
                     break;
                 case 1:
                     sciprint(_("type 1 function not allowed for scilab blocks\n"));
@@ -542,21 +540,21 @@ int C2F(scicos)(double *x_in, int *xptr_in, double *z__,
                     FREE_blocks();
                     return 0;
                 case 3:
-                    Blocks[kf].funpt = sciblk2;
+                    Blocks[kf].funpt = (voidg) sciblk2;
                     Blocks[kf].type = 2;
                     break;
                 case 5:
-                    Blocks[kf].funpt = sciblk4;
+                    Blocks[kf].funpt = (voidg) sciblk4;
                     Blocks[kf].type = 4;
                     break;
                 case 99: /* debugging block */
-                    Blocks[kf].funpt = sciblk4;
+                    Blocks[kf].funpt = (voidg) sciblk4;
                     /*Blocks[kf].type=4;*/
                     debug_block = kf;
                     break;
 
                 case 10005:
-                    Blocks[kf].funpt = sciblk4;
+                    Blocks[kf].funpt = (voidg) sciblk4;
                     Blocks[kf].type = 10004;
                     break;
                 default :
@@ -569,7 +567,7 @@ int C2F(scicos)(double *x_in, int *xptr_in, double *z__,
         }
         else if (i <= ntabsim)
         {
-            Blocks[kf].funpt = *(tabsim[i - 1].fonc);
+            Blocks[kf].funpt = (voidg) * (tabsim[i - 1].fonc);
             Blocks[kf].scsptr = 0;     /* this is done for being able to test if a block
                                                                         is a scilab block in the debugging phase when
                                                                         sciblk4 is called */
@@ -761,6 +759,17 @@ int C2F(scicos)(double *x_in, int *xptr_in, double *z__,
         Blocks[kf].label[i1] = '\0';
         C2F(cvstr)(&i1, &(iz[izptr[kf + 1] - 1]), Blocks[kf].label, &job, i1);
 
+        /* block uid (uid) */
+        i1 = uidptr[kf + 1] - uidptr[kf];
+        if ((Blocks[kf].uid = MALLOC(sizeof(char) * (i1 + 1))) == NULL)
+        {
+            FREE_blocks();
+            *ierr = 5;
+            return 0;
+        }
+        Blocks[kf].uid[i1] = '\0';
+        C2F(cvstr)(&i1, &(uid[uidptr[kf] - 1]), Blocks[kf].uid, &job, i1);
+
         /* 12 : block array of crossed surfaces (jroot) */
         Blocks[kf].jroot = NULL;
         if (Blocks[kf].ng != 0)
@@ -812,22 +821,23 @@ int C2F(scicos)(double *x_in, int *xptr_in, double *z__,
     }
 
     /* save ptr of scicos in import structure */
-    C2F(makescicosimport)(x, &nx, &xptr[1], &zcptr[1], z__, &nz, &zptr[1],
-                          &noz, oz, ozsz, oztyp, &ozptr[1],
-                          g, &ng, mod, &nmod, &modptr[1], iz, &izptr[1],
-                          &inpptr[1], &inplnk[1], &outptr[1], &outlnk[1],
-                          outtbptr, outtbsz, outtbtyp,
-                          outtb_elem, &nelem,
-                          &nlnk, rpar, &rpptr[1], ipar, &ipptr[1],
-                          opar, oparsz, opartyp, &opptr[1],
-                          &nblk, subscr, nsubs,
-                          &tevts[1], &evtspt[1], nevts, pointi,
-                          &iord[1], &niord, &oord[1], &noord, &zord[1], &nzord,
-                          funptr, &funtyp[1], &ztyp[1],
-                          &cord[1], &ncord, &ordclk[1], &nordclk, &clkptr[1],
-                          &ordptr[1], &nordptr, &critev[1], iwa, Blocks,
-                          t0, tf, &Atol, &rtol, &ttol, &deltat, &hmax,
-                          xprop, xd);
+    makescicosimport(x, &nx, &xptr[1], &zcptr[1], z__, &nz, &zptr[1],
+                     &noz, oz, ozsz, oztyp, &ozptr[1],
+                     g, &ng, mod, &nmod, &modptr[1], iz, &izptr[1],
+                     uid, uidptr,
+                     &inpptr[1], &inplnk[1], &outptr[1], &outlnk[1],
+                     outtbptr, outtbsz, outtbtyp,
+                     outtb_elem, &nelem,
+                     &nlnk, rpar, &rpptr[1], ipar, &ipptr[1],
+                     opar, oparsz, opartyp, &opptr[1],
+                     &nblk, subscr, nsubs,
+                     &tevts[1], &evtspt[1], nevts, pointi,
+                     &iord[1], &niord, &oord[1], &noord, &zord[1], &nzord,
+                     funptr, &funtyp[1], &ztyp[1],
+                     &cord[1], &ncord, &ordclk[1], &nordclk, &clkptr[1],
+                     &ordptr[1], &nordptr, &critev[1], iwa, Blocks,
+                     t0, tf, &Atol, &rtol, &ttol, &deltat, &hmax,
+                     xprop, xd);
 
     if (*flag__ == 1)   /*start*/
     {
@@ -957,7 +967,7 @@ static int check_flag(void *flagvalue, char *funcname, int opt)
     if (opt == 0 && flagvalue == NULL)
     {
         sciprint(_("\nSUNDIALS_ERROR: %s() failed - returned NULL pointer\n\n"), funcname);
-        return(1);
+        return (1);
     }
     /* Check if flag < 0 */
     else if (opt == 1)
@@ -967,17 +977,17 @@ static int check_flag(void *flagvalue, char *funcname, int opt)
         {
             sciprint(_("\nSUNDIALS_ERROR: %s() failed with flag = %d\n\n"),
                      funcname, *errflag);
-            return(1);
+            return (1);
         }
     }
     /* Check if function returned NULL pointer - no memory allocated */
     else if (opt == 2 && flagvalue == NULL)
     {
         sciprint(_("\nMEMORY_ERROR: %s() failed - returned NULL pointer\n\n"), funcname);
-        return(1);
+        return (1);
     }
 
-    return(0);
+    return (0);
 } /* check_flag */
 
 /*--------------------------------------------------------------------------*/
@@ -6048,6 +6058,14 @@ static void FREE_blocks()
         {
             break;
         }
+        if (Blocks[kf].uid != NULL)
+        {
+            FREE(Blocks[kf].uid);
+        }
+        else
+        {
+            break;
+        }
         if (Blocks[kf].evout != NULL)
         {
             FREE(Blocks[kf].evout);
@@ -6086,7 +6104,7 @@ int C2F(funnum)(char * fname)
     {
         if ( strcmp(fname, tabsim[i].name) == 0 )
         {
-            return(i + 1);
+            return (i + 1);
         }
         i++;
     }
@@ -6095,9 +6113,9 @@ int C2F(funnum)(char * fname)
     C2F(iislink)(fname, &loc);
     if (loc >= 0)
     {
-        return(ntabsim + (int)loc + 1);
+        return (ntabsim + (int)loc + 1);
     }
-    return(0);
+    return (0);
 }/* funnum */
 /*--------------------------------------------------------------------------*/
 int get_phase_simulation(void)
@@ -6451,6 +6469,7 @@ static int Jacobians(long int Neq, realtype tt, realtype cj, N_Vector yy,
     }
     /*----------------------------------------------*/
     job = 1; /* read jacobian through flag=10; */
+    *block_error = 0;
     Jdoit(&ttx, xc, xcdot, &Fx[-m], &job);/* Filling up the FX:Fu:Gx:Gu*/
     if (*block_error != 0)
     {
diff --git a/scilab/modules/scicos/src/c/scicos_internal.h b/scilab/modules/scicos/src/c/scicos_internal.h
new file mode 100644 (file)
index 0000000..f0a1f40
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) Scilab Enterprises - 2013 - Clement DAVID
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "scicos-def.h"
+
+void makescicosimport(double *x, int *nx,
+                      int *xptr, int *zcptr,
+                      double *z, int *nz, int *zptr,
+                      int *noz, void **oz, int *ozsz, int *oztyp, int *ozptr,
+                      double *g, int *ng,
+                      int *mod, int *nmod, int *modptr,
+                      int *iz, int *izptr, int *uid, int *uidptr, int *inpptr, int *inplnk,
+                      int *outptr, int *outlnk, void **outtbptr, int *outtbsz, int *outtbtyp,
+                      outtb_el *outtb_elem, int *nelem,
+                      int *nlnk, double *rpar, int *rpptr, int *ipar, int *ipptr,
+                      void **opar, int *oparsz, int *opartyp, int *opptr,
+                      int *nblk, int *subs, int *nsubs,
+                      double *tevts, int *evtspt, int *nevts, int *pointi,
+                      int *iord, int *niord, int *oord, int *noord, int *zord, int *nzord,
+                      int *funptr, int *funtyp, int *ztyp,
+                      int *cord, int *ncord, int *ordclk, int *nordclk, int *clkptr,
+                      int *ordptr, int *nordptr, int *critev,  int *iwa, scicos_block *blocks,
+                      double *t0, double *tf, double *Atol, double *rtol, double *ttol, double *deltat, double *hmax,
+                      int *xprop, double *xd);
+
+extern SCICOS_IMPEXP COSDEBUGCOUNTER_struct C2F(cosdebugcounter);
+extern SCICOS_IMPEXP RTFACTOR_struct C2F(rtfactor);
+extern SCICOS_IMPEXP SOLVER_struct C2F(cmsolver);
+extern SCICOS_IMPEXP CURBLK_struct C2F(curblk);
+extern SCICOS_IMPEXP COSDEBUG_struct C2F(cosdebug);
+extern SCICOS_IMPEXP COSHLT_struct C2F(coshlt);
+extern SCICOS_IMPEXP DBCOS_struct C2F(dbcos);
+extern SCICOS_IMPEXP COSTOL_struct C2F(costol);
+extern SCICOS_IMPEXP COSERR_struct coserr;
index 3f92ec2..d2ce92d 100644 (file)
@@ -70,6 +70,7 @@ typedef struct
     void **work;
     int nmode;
     int *mode;
+    char *uid;
 } scicos_block;
 
 
index 1a3531e..bb09727 100644 (file)
@@ -81,6 +81,7 @@ typedef struct
     void **work;
     int nmode;
     int *mode;
+    char *uid;
 } scicos_block;
 
 /** define scicos flag number */
index 3aafc1e..636b866 100644 (file)
@@ -1704,6 +1704,11 @@ scicos_free(*work);
                     <emphasis role="bold">block-&gt;label :</emphasis> Strings array that allows to retrieve the label of the block.
                 </para>
             </listitem>
+            <listitem>
+                <para>
+                    <emphasis role="bold">block-&gt;uid :</emphasis> Strings array that allows to retrieve the uid of the block.
+                </para>
+            </listitem>
         </itemizedlist>
     </refsection>
 </refentry>
index c787b37..6b381d5 100644 (file)
                     <emphasis role="bold">block.label :</emphasis> a string given the label of the block. This is a read only data.
                 </para>
             </listitem>
+            <listitem>
+                <para>
+                    <emphasis role="bold">block.uid :</emphasis> a string given the uid of the block. This is a read only data.
+                </para>
+            </listitem>
         </itemizedlist>
         <para>
             
index 5d1512b..ae98bbb 100644 (file)
@@ -54,6 +54,7 @@ import org.scilab.modules.gui.menuitem.MenuItem;
 import org.scilab.modules.gui.menuitem.ScilabMenuItem;
 import org.scilab.modules.types.ScilabDouble;
 import org.scilab.modules.types.ScilabList;
+import org.scilab.modules.types.ScilabMList;
 import org.scilab.modules.types.ScilabString;
 import org.scilab.modules.types.ScilabType;
 import org.scilab.modules.xcos.Xcos;
@@ -80,6 +81,7 @@ import org.scilab.modules.xcos.graph.PaletteDiagram;
 import org.scilab.modules.xcos.graph.SuperBlockDiagram;
 import org.scilab.modules.xcos.graph.XcosDiagram;
 import org.scilab.modules.xcos.io.scicos.BasicBlockInfo;
+import org.scilab.modules.xcos.io.scicos.DiagramElement;
 import org.scilab.modules.xcos.io.scicos.ScicosFormatException;
 import org.scilab.modules.xcos.io.scicos.ScilabDirectHandler;
 import org.scilab.modules.xcos.port.BasicPort;
@@ -328,6 +330,10 @@ public class BasicBlock extends ScilabGraphUniqueObject implements Serializable
     private ScilabType exprs;
     // private List<Double> realParameters = new ArrayList<Double>();
     private ScilabType realParameters;
+    /**
+     * Update status on the rpar mlist, if true then a re-encode has to be performed on the getter.
+     */
+    protected boolean hasAValidRpar = false;
     // private List<Integer> integerParameters = new ArrayList<Integer>();
     private ScilabType integerParameters;
     // private List objectsParameters = new ArrayList();
@@ -643,6 +649,15 @@ public class BasicBlock extends ScilabGraphUniqueObject implements Serializable
      * @return real parameter ( rpar )
      */
     public ScilabType getRealParameters() {
+        if (!hasAValidRpar && realParameters instanceof ScilabMList) {
+            try {
+                final DiagramElement elem = new DiagramElement();
+                realParameters = elem.encode(elem.decode(realParameters, new XcosDiagram(false)), null);
+            } catch (ScicosFormatException e) {
+                // do nothing on error (no assignation)
+            }
+        }
+
         return realParameters;
     }
 
@@ -660,6 +675,14 @@ public class BasicBlock extends ScilabGraphUniqueObject implements Serializable
     }
 
     /**
+     * Invalide the rpar, a new child diagram encoding will be performed on
+     * demand.
+     */
+    public void invalidateRpar() {
+        hasAValidRpar = false;
+    }
+
+    /**
      * @return integer parameter ( ipar )
      */
     public ScilabType getIntegerParameters() {
index 61d0702..6ef38d7 100644 (file)
@@ -90,7 +90,6 @@ public final class SuperBlock extends BasicBlock {
     private static final String MASKED_INTERFUNCTION_NAME = "DSUPER";
 
     private SuperBlockDiagram child;
-    private boolean hasAValidRpar = false;
 
     /**
      * Constructor
@@ -151,7 +150,7 @@ public final class SuperBlock extends BasicBlock {
 
     @Override
     public ScilabType getRealParameters() {
-        if (hasAValidRpar || child == null) {
+        if (child == null) {
             return super.getRealParameters();
         }
 
@@ -166,14 +165,6 @@ public final class SuperBlock extends BasicBlock {
     }
 
     /**
-     * Invalide the rpar, a new child diagram encoding will be performed on
-     * demand.
-     */
-    public void invalidateRpar() {
-        hasAValidRpar = false;
-    }
-
-    /**
      * openBlockSettings this method is called when a double click occurred on a
      * super block
      *
index 4fecc66..a7dd64e 100644 (file)
@@ -151,66 +151,77 @@ public class XcosDiagram extends ScilabGraph {
     private final transient CompilationEngineStatus engine;
 
     /**
-     * Constructor
+     * Default constructor for a visible diagram
      */
     public XcosDiagram() {
+        this(true);
+    }
+
+    /**
+     * Constructor
+     *
+     * @param withVisibleFeatures true if the visible features should be activated, false otherwise. Disable it on encode/decode leads to a huge performance gain.
+     */
+    public XcosDiagram(final boolean withVisibleFeatures) {
         super();
 
         // Scicos related setup
         engine = new CompilationEngineStatus();
         setScicosParameters(new ScicosParameters());
 
-        // Add a default listener to update the modification status when
-        // something has changed on the ScicosParameters
-        scicosParameters.addPropertyChangeListener(new PropertyChangeListener() {
-            @Override
-            public void propertyChange(final PropertyChangeEvent evt) {
-                setModified(true);
-            }
-        });
+        if (withVisibleFeatures) {
+            // Add a default listener to update the modification status when
+            // something has changed on the ScicosParameters
+            scicosParameters.addPropertyChangeListener(new PropertyChangeListener() {
+                @Override
+                public void propertyChange(final PropertyChangeEvent evt) {
+                    setModified(true);
+                }
+            });
 
-        setComponent(new GraphComponent(this));
-        initComponent();
-        installStylesheet();
+            setComponent(new GraphComponent(this));
+            initComponent();
+            installStylesheet();
 
-        // Forbid disconnecting cells once it is connected.
-        setCellsDisconnectable(false);
+            // Forbid disconnecting cells once it is connected.
+            setCellsDisconnectable(false);
 
-        // Forbid pending edges.
-        setAllowDanglingEdges(false);
+            // Forbid pending edges.
+            setAllowDanglingEdges(false);
 
-        // Cannot connect port to itself.
-        setAllowLoops(false);
+            // Cannot connect port to itself.
+            setAllowLoops(false);
 
-        // Override isCellResizable to filter what the user can resize
-        setCellsResizable(true);
+            // Override isCellResizable to filter what the user can resize
+            setCellsResizable(true);
 
-        /* Labels use HTML if not equal to interface function name */
-        setHtmlLabels(true);
-        /*
-         * by default every label is movable, see
-         * XcosDiagram##isLabelMovable(java.lang.Object) for restrictions
-         */
-        setVertexLabelsMovable(true);
-        setEdgeLabelsMovable(true);
+            /* Labels use HTML if not equal to interface function name */
+            setHtmlLabels(true);
+            /*
+             * by default every label is movable, see
+             * XcosDiagram##isLabelMovable(java.lang.Object) for restrictions
+             */
+            setVertexLabelsMovable(true);
+            setEdgeLabelsMovable(true);
 
-        //
-        setCloneInvalidEdges(true);
+            //
+            setCloneInvalidEdges(true);
 
-        // Override isCellEditable to filter what the user can edit
-        setCellsEditable(true);
+            // Override isCellEditable to filter what the user can edit
+            setCellsEditable(true);
 
-        setConnectableEdges(true);
+            setConnectableEdges(true);
 
-        // Do not clear edge points on connect
-        setResetEdgesOnConnect(false);
+            // Do not clear edge points on connect
+            setResetEdgesOnConnect(false);
 
-        setMultiplicities();
+            setMultiplicities();
 
-        setAutoOrigin(true);
+            setAutoOrigin(true);
 
-        // Add a listener to track when model is changed
-        getModel().addListener(mxEvent.CHANGE, ModelTracker.getInstance());
+            // Add a listener to track when model is changed
+            getModel().addListener(mxEvent.CHANGE, ModelTracker.getInstance());
+        }
 
         ((mxCell) getDefaultParent()).setId((new UID()).toString());
         ((mxCell) getModel().getRoot()).setId((new UID()).toString());
@@ -2085,7 +2096,6 @@ public class XcosDiagram extends ScilabGraph {
             Xcos.getInstance().addDiagram(file, this);
         }
         setTitle(name.substring(0, name.lastIndexOf('.')));
-        generateUID();
         setModified(false);
 
         fireEvent(new mxEventObject(mxEvent.ROOT));
@@ -2304,6 +2314,7 @@ public class XcosDiagram extends ScilabGraph {
                 t.stop();
                 XcosDiagram.this.setReadOnly(false);
                 XcosDiagram.this.getUndoManager().clear();
+                XcosDiagram.this.refresh();
 
                 /*
                  * Load has finished
@@ -2318,40 +2329,6 @@ public class XcosDiagram extends ScilabGraph {
     }
 
     /**
-     * generate unique id to all blocks in diagram
-     */
-    public void generateUID() {
-        for (int i = 0; i < getModel().getChildCount(getDefaultParent()); ++i) {
-            if (getModel().getChildAt(getDefaultParent(), i) instanceof BasicBlock) {
-                final BasicBlock block = (BasicBlock) getModel().getChildAt(getDefaultParent(), i);
-                if (block.getRealParameters() instanceof ScilabMList) {
-                    if (block instanceof SuperBlock) {
-                        final SuperBlock parent = ((SuperBlock) block);
-
-                        // generate a child diagram with UID
-                        parent.createChildDiagram(true);
-                    } else {
-                        // we have a hidden SuperBlock, create a real one
-                        SuperBlock newSP = (SuperBlock) BlockFactory.createBlock(SuperBlock.INTERFUNCTION_NAME);
-                        newSP.setParentDiagram(block.getParentDiagram());
-
-                        newSP.setRealParameters(block.getRealParameters());
-                        newSP.createChildDiagram(true);
-
-                        block.setRealParameters(newSP.getRealParameters());
-                    }
-                } else if (block.getId() == null || block.getId().compareTo("") == 0) {
-                    /*
-                     * FIXME: Change of a cell id out of model modification in
-                     * which case ?
-                     */
-                    block.generateId();
-                }
-            }
-        }
-    }
-
-    /**
      * Update all the children of the current graph.
      */
     public void setChildrenParentDiagram() {
index afbf3d3..4d37fec 100644 (file)
@@ -196,6 +196,7 @@ public class BasicBlockCodec extends XcosObjectCodec {
             if (superBlock.getChild() != null) {
                 superBlock.getChild().setContainer(superBlock);
             }
+            superBlock.invalidateRpar();
         }
 
         // update style to replace direction by rotation and add the
index 44a2d70..13c21a3 100644 (file)
@@ -33,6 +33,8 @@ import org.scilab.modules.xcos.port.BasicPort;
 import org.scilab.modules.xcos.port.command.CommandPort;
 import org.scilab.modules.xcos.port.control.ControlPort;
 
+import com.mxgraph.model.mxCell;
+
 /**
  * Protected class which decode model fields of a block.
  *
@@ -40,8 +42,13 @@ import org.scilab.modules.xcos.port.control.ControlPort;
  */
 // CSOFF: ClassDataAbstractionCoupling
 final class BlockModelElement extends BlockPartsElement {
-    static final List<String> DATA_FIELD_NAMES = asList("model", "sim", "in", "in2", "intyp", "out", "out2", "outtyp", "evtin", "evtout", "state", "dstate",
+    /*
+     * "uid" have been added on the 5.5.0 cycle. It is not checked to be compatible with older versions.
+     */
+    protected static final List<String> DATA_FIELD_NAMES = asList("model", "sim", "in", "in2", "intyp", "out", "out2", "outtyp", "evtin", "evtout", "state", "dstate",
             "odstate", "rpar", "ipar", "opar", "blocktype", "firing", "dep_ut", "label", "nzcross", "nmode", "equations");
+    protected static final List<String> DATA_FIELD_NAMES_FULL = asList("model", "sim", "in", "in2", "intyp", "out", "out2", "outtyp", "evtin", "evtout", "state", "dstate",
+            "odstate", "rpar", "ipar", "opar", "blocktype", "firing", "dep_ut", "label", "nzcross", "nmode", "equations", "uid");
 
     private static final int CTRL_PORT_INDEX = DATA_FIELD_NAMES.indexOf("evtin");
     private static final int CMD_PORT_INDEX = DATA_FIELD_NAMES.indexOf("evtout");
@@ -272,6 +279,20 @@ final class BlockModelElement extends BlockPartsElement {
         // equation
         field++;
         into.setEquations(data.get(field));
+
+        // uid
+        // compatibility check, for pre-5.5.0 diagrams
+        field++;
+        if (field >= data.size()) {
+            return;
+        }
+        final ScilabType uid = data.get(field);
+        if (uid instanceof ScilabString) {
+            final String id = ((ScilabString) uid).getData()[0][0];
+            if (id != null && !id.isEmpty()) {
+                into.setId(id);
+            }
+        }
     }
 
     /**
@@ -296,7 +317,7 @@ final class BlockModelElement extends BlockPartsElement {
         int field = 0;
 
         // we test if the structure as enough field
-        if (data.size() != DATA_FIELD_NAMES.size()) {
+        if (data.size() < DATA_FIELD_NAMES.size()) {
             throw new WrongStructureException(DATA_FIELD_NAMES);
         }
 
@@ -311,10 +332,10 @@ final class BlockModelElement extends BlockPartsElement {
         final String[] header = ((ScilabString) data.get(field)).getData()[0];
 
         // Checking for the field names
-        if (header.length != DATA_FIELD_NAMES.size()) {
+        if (header.length < DATA_FIELD_NAMES.size()) {
             throw new WrongStructureException(DATA_FIELD_NAMES);
         }
-        for (int i = 0; i < header.length; i++) {
+        for (int i = 0; i < DATA_FIELD_NAMES.size(); i++) {
             if (!header[i].equals(DATA_FIELD_NAMES.get(i))) {
                 throw new WrongStructureException(DATA_FIELD_NAMES);
             }
@@ -458,6 +479,8 @@ final class BlockModelElement extends BlockPartsElement {
         if (!(data.get(field) instanceof ScilabTList) && !isEmptyField(data.get(field))) {
             throw new WrongTypeException(DATA_FIELD_NAMES, field);
         }
+
+        // uid not checked, introduced in Scilab 5.5.0
     }
 
     // CSON: CyclomaticComplexity
@@ -584,7 +607,13 @@ final class BlockModelElement extends BlockPartsElement {
         data.set(field, new ScilabBoolean(dependsOnUandT));
 
         field++; // label
-        data.set(field, new ScilabString(from.getId()));
+        final XcosDiagram parent = from.getParentDiagram();
+        if (parent != null) {
+            final mxCell identifier = parent.getCellIdentifier(from);
+            if (identifier != null && identifier.getValue() != null) {
+                data.set(field, new ScilabString(identifier.getValue().toString()));
+            }
+        }
 
         field++; // nzcross
         property = from.getNbZerosCrossing();
@@ -607,6 +636,10 @@ final class BlockModelElement extends BlockPartsElement {
         }
         data.set(field, property);
 
+        field++; // uid
+        property = new ScilabString(from.getId());
+        data.set(field, property);
+
         data = (ScilabMList) afterEncode(from, data);
 
         return data;
@@ -621,7 +654,7 @@ final class BlockModelElement extends BlockPartsElement {
      * @return the new element
      */
     private ScilabMList allocateElement() {
-        ScilabMList element = new ScilabMList(DATA_FIELD_NAMES.toArray(new String[0]));
+        ScilabMList element = new ScilabMList(DATA_FIELD_NAMES_FULL.toArray(new String[0]));
         element.add(new ScilabList()); // sim
         addSizedPortVector(element, ScilabDouble.class, getInSize()); // in
         addSizedPortVector(element, ScilabDouble.class, getInSize()); // in2
@@ -644,6 +677,7 @@ final class BlockModelElement extends BlockPartsElement {
         element.add(new ScilabDouble()); // nzcross
         element.add(new ScilabDouble()); // nmode
         element.add(new ScilabList()); // equations
+        element.add(new ScilabString("")); // uid
         return element;
     }
 }