cscope.c

Go to the documentation of this file.
00001 //** 6 July 2006: 
00002 //** ---- OLD GRAPHICS SUPPORT FOR OLD  C and Fortran computational functions
00003 
00004 
00005 #include "scicos_block.h"
00006 #include <math.h>
00007 #include "machine.h"
00008 
00009 static int c__1 = 1;
00010 static int c__0 = 0;
00011 static int c_n1 = -1;
00012 static int c__4 = 4;
00013 static int c__21 = 21;
00014 static int c__3 = 3;
00015 static double c_b84 = 0.;
00016 /*
00017 extern int getVersionFlag(void); //** external  (1 old ; 0 new) 
00018 extern void setVersionFlag(int newFlag);
00019 */
00020 
00021 void cscope(scicos_block *block,int flag)
00022 {
00023   double t;
00024   double *z__;
00025   double *rpar;
00026   int *ipar, nipar,nu,kfun;
00027   
00028   //** Patch to OLD graphics
00029   int default_graphics ;
00030  
00031   /* Initialized data */
00032   
00033   static double frect[4] = { 0.,0.,1.,1. };
00034   static int cur = 0;
00035   static int verb = 0;
00036   
00037   int i__1,i;
00038   
00039   static double rect[4];
00040   extern int C2F(getlabel)(), C2F(dset)();
00041   static double ymin, ymax;
00042   static int i__, k, n, v;
00043   static double tsave;
00044   static int n1, n2;
00045   extern int C2F(plot2d)(), C2F(setscale2d)();
00046   static int na;
00047   extern int C2F(dr)();
00048   static double dt, dv;
00049   static int nxname;
00050   extern int C2F(sciwin)(), C2F(dr1)(), C2F(scicosclip)();
00051   static char buf[40];
00052   static int wid, iwd;
00053   static double per;
00054   static int nax[4], iwp;
00055   
00056   /*     Copyright INRIA */
00057   /*     Scicos block simulator */
00058   /*     ipar(1) = win_num */
00059   /*     ipar(2) = 0/1 color flag */
00060   /*     ipar(3) = buffer size */
00061   /*     ipar(4:11) = line type for ith curve */
00062   
00063   /*     ipar(12:13) : window position */
00064   /*     ipar(14:15) : window dimension */
00065   
00066   /*     rpar(1)=dt */
00067   /*     rpar(2)=ymin */
00068   /*     rpar(3)=ymax */
00069   /*     rpar(4)=periode */
00070   
00071    nu=block->insz[0];
00072   if (nu>8) {nu=8;}
00073   rpar=block->rpar;
00074   ipar=block->ipar;
00075   nipar=block->nipar;
00076   t=get_scicos_time();
00077   
00078   /*      character*(4) logf */
00079   /* Parameter adjustments */
00080   --ipar;
00081   --rpar;
00082   
00083   iwp = nipar - 3;
00084   iwd = nipar - 1;
00085 
00086   wid = ipar[1];
00087   if(wid==-1){
00088     wid=20000+get_block_number();
00089   }
00090   
00091   if (flag == 2) {
00092     z__=*block->work; 
00093     --z__;
00094     dt = rpar[1];
00095     ymin = rpar[2];
00096     ymax = rpar[3];
00097     per = rpar[4];
00098     n = ipar[3];
00099     k = (int) z__[1];
00100     if (k > 0) {
00101       n1 = (int) (z__[k + 1] / per);
00102       if (z__[k + 1] < 0.) {
00103         --n1;
00104       }
00105     } else {
00106       n1 = 0;
00107     }
00108     
00109     tsave = t;
00110     if (dt > 0.) {
00111       t = z__[k + 1] + dt;
00112     }
00113     
00114     n2 = (int) (t / per);
00115     if (t < 0.) {
00116       --n2;
00117     }
00118     
00119     /*     add new point to the buffer */
00120     ++k;
00121     z__[k + 1] = t;
00122     for (i = 0; i < nu; ++i) {
00123       z__[n + 1 + i * n + k] = block->inptr[0][i];
00124       /* L1: */
00125     }
00126     z__[1] = (double) k;
00127     if (n1 == n2 && k < n) {
00128       t = tsave;
00129       return ;
00130     }
00131     
00132     /*     plot 1:K points of the buffer */
00133     C2F(dr1)("xget\000", "window\000", &verb, &cur, &na, &v, &v, &v, &dv, &dv,
00134              &dv, &dv);
00135     if (cur != wid) {
00136       C2F(dr1)("xset\000", "window\000", &wid, &v, &v, &v, &v, &v, &dv, &dv,
00137                &dv, &dv);
00138     }
00139     C2F(dr1)("xsetdr\000", "Rec\000", &v, &v, &v, &v, &v, &v, &dv, &dv, &dv, &
00140              dv);
00141     if (k > 0) {
00142       C2F(scicosclip)(&c__1);
00143       for (i__ = 0; i__ < nu; ++i__) {
00144         C2F(dr1)("xpolys\000", "v\000", &v, &v, &ipar[i__ + 4], &c__1, &k,
00145                  &v, &z__[2], &z__[n + 2 + i__  * n], &dv, &dv);
00146       }
00147       C2F(scicosclip)(&c__0);
00148     }
00149     /*     shift buffer left */
00150     z__[2] = z__[k + 1];
00151     for (i__ = 0; i__ < nu; ++i__) {
00152       z__[n + 1 + i__ * n + 1] = z__[n + 1 + i__ * n + k];
00153     }
00154     z__[1] = 1.;
00155         if (n1 != n2) {
00156           /*     clear window */
00157           nax[0] = 2;
00158           nax[1] = 10;
00159             nax[2] = 5;
00160             nax[3] = 4;
00161             C2F(dr1)("xclear\000", "v\000", &v, &v, &v, &v, &v, &v, &dv, &dv, &dv,
00162                      &dv);
00163             C2F(dr1)("xset\000", "use color\000", &ipar[2], &c__0, &c__0, &c__0, &
00164                      c__0, &v, &dv, &dv, &dv, &dv);
00165             C2F(dr)("xstart\000", "v\000", &wid, &v, &v, &v, &v, &v, &dv, &dv, &
00166                     dv, &dv);
00167             rect[0] = per * (n1 + 1);
00168             rect[1] = ymin;
00169             rect[2] = per * (n1 + 2);
00170             rect[3] = ymax;
00171             C2F(dr1)("xset\000", "dashes\000", &c__0, &c__0, &c__0, &c__0, &c__0, 
00172                      &v, &dv, &dv, &dv, &dv);
00173             C2F(plot2d)(rect, &rect[1], &c__1, &c__1, &c_n1, "011", buf, rect, nax,
00174                         &c__4, &c__21);
00175         }
00176         t = tsave;
00177 
00178     //** init : initialization                  
00179   } else if (flag == 4) {/* the workspace is used to store buffer 
00180                              */
00181     if ((*block->work=
00182          scicos_malloc(sizeof(double)*(1+ipar[3]*(1+nu))))== NULL ) {
00183       set_block_error(-16);
00184       return;
00185     }
00186     z__=*block->work; 
00187     --z__;
00188     z__[1]=-1.0;
00189 
00190 
00191     n = ipar[3];
00192     ymin = rpar[2];
00193     ymax = rpar[3];
00194     per = rpar[4];
00195     nax[0] = 2;
00196     nax[1] = 10;
00197     nax[2] = 5;
00198     nax[3] = 4;
00199     n1 = (int) (t / per);
00200     if (t <= 0.) {
00201       --n1;
00202     }
00203     
00204     //** --------------------- 
00205         //    default_graphics = getVersionFlag() ;
00206         //    setVersionFlag(1) ; //** force the old graphics
00207     
00208     C2F(sciwin)();
00209     C2F(dr1)("xset\000", "window\000", &wid, &v, &v, &v, &v, &v, &dv, &dv, &
00210              dv, &dv);
00211     C2F(dr1)("xsetdr\000", "Rec\000", &v, &v, &v, &v, &v, &v, &dv, &dv, &dv, &
00212              dv);
00213     if (ipar[iwp] >= 0) {
00214             C2F(dr1)("xset\000", "wpos\000", &ipar[iwp], &ipar[iwp + 1], &v, &v, &
00215                      v, &v, &dv, &dv, &dv, &dv);
00216     }
00217     if (ipar[iwd] >= 0) {
00218       C2F(dr1)("xset\000", "wdim\000", &ipar[iwd], &ipar[iwd + 1], &v, &v, &
00219                v, &v, &dv, &dv, &dv, &dv);
00220       /*     to force dimensions update */
00221       C2F(dr1)("xset\000", "window\000", &wid, &v, &v, &v, &v, &v, &dv, &dv,
00222                &dv, &dv);
00223     }
00224     rect[0] = per * (n1 + 1);
00225     rect[1] = ymin;
00226     rect[2] = per * (n1 + 2);
00227     rect[3] = ymax;
00228     C2F(setscale2d)(frect, rect, "nn\000");
00229     C2F(dr1)("xset\000", "use color\000", &ipar[2], &c__0, &c__0, &c__0, &
00230              c__0, &v, &dv, &dv, &dv, &dv);
00231     C2F(dr1)("xset\000", "alufunction\000", &c__3, &c__0, &c__0, &c__0, &c__0,
00232              &v, &dv, &dv, &dv, &dv);
00233     C2F(dr1)("xclear\000", "v\000", &v, &v, &v, &v, &v, &v, &dv, &dv, &dv, &
00234              dv);
00235     C2F(dr)("xstart\000", "v\000", &wid, &v, &v, &v, &v, &v, &dv, &dv, &dv, &
00236             dv);
00237     C2F(dr1)("xset\000", "dashes\000", &c__0, &c__0, &c__0, &c__0, &c__0, &v, 
00238              &dv, &dv, &dv, &dv);
00239     C2F(plot2d)(rect, &rect[1], &c__1, &c__1, &c_n1, "011", buf, rect, nax, &
00240                 c__4, &c__21);
00241     C2F(scicosclip)(&c__1);
00242     nxname = 40;
00243     kfun=get_block_number();
00244     C2F(getlabel)(&kfun, buf, &nxname);
00245     if (nxname > 39) {
00246       nxname = 39;
00247     }
00248     i__1 = nxname;
00249     *(buf+i__1)=*"\000";
00250     if ((nxname == 1 && *(unsigned char *)buf == ' ') || (nxname == 0)) {
00251     } else {
00252       C2F(dr)("xname\000", buf, &v, &v, &v, &v, &v, &v, &dv, &dv, &dv, &dv);
00253     }
00254     z__[1] = 0.;
00255     z__[2] = t;
00256     i__1 = nu * n;
00257     C2F(dset)(&i__1, &c_b84, &z__[3], &c__1);
00258     
00259     //** --- restore the graphics mode 
00260         //    setVersionFlag(default_graphics) ;
00261   
00262   } else if (flag == 5) {
00263     z__=*block->work; 
00264     --z__;
00265     n = ipar[3];
00266     k = (int) z__[1];
00267     if (k <= 1) {
00268       scicos_free(*block->work);
00269       return ;
00270     }
00271     C2F(dr1)("xget\000", "window\000", &verb, &cur, &na, &v, &v, &v, &dv, &dv,
00272              &dv, &dv);
00273     if (cur != wid) {
00274       C2F(dr1)("xset\000", "window\000", &wid, &v, &v, &v, &v, &v, &dv, &dv,
00275                &dv, &dv);
00276     }
00277     C2F(scicosclip)(&c__1);
00278     for (i__ = 0; i__ < nu; ++i__) {
00279       C2F(dr1)("xpolys\000", "v\000", &v, &v, &ipar[i__ + 4], &c__1, &k, &v,
00280                &z__[2], &z__[n + 2 + i__ * n], &dv, &dv);
00281     }
00282     C2F(scicosclip)(&c__0);
00283     scicos_free(*block->work);
00284   }
00285 }
00286 
00287 //** ---- OLD GRAPHICS SUPPORT FOR OLD Computational function   
00288 
00289 void C2F (oldgraphics) (int *flag)
00290 {
00291   
00292   //** flag = 1 ; old graphics back compatibility
00293   //** flag = 0 ; default graphics mode 
00294       
00295         //  setVersionFlag(*flag) ; //** force the old graphics
00296   
00297   // debug only :)
00298   // printf("\n versionflag = %d \n  ", versionflag);
00299 
00300 }
00301 

Generated on Sun Mar 4 15:03:59 2007 for Scilab [trunk] by  doxygen 1.5.1