00001
00002
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
00018
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
00029 int default_graphics ;
00030
00031
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
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
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
00079
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
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
00125 }
00126 z__[1] = (double) k;
00127 if (n1 == n2 && k < n) {
00128 t = tsave;
00129 return ;
00130 }
00131
00132
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
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
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
00179 } else if (flag == 4) {
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
00206
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
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
00260
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
00288
00289 void C2F (oldgraphics) (int *flag)
00290 {
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300 }
00301