00001
00002
00003
00004 #include <stdio.h>
00005 #include "core_math.h"
00006
00007 extern int C2F(getgeom)(double *);
00008
00009
00010
00011
00012 extern int C2F(dr1)( char x0[],char x1[],integer *x2,integer *x3,integer *x4,integer *x5,integer *x6,
00013 integer *x7,double *dx1,double *dx2,double *dx3,double *dx4,
00014 integer lx0, integer lx1) ;
00015
00016 extern int C2F(dr)(char x0[],char x1[],integer *x2,integer *x3,integer *x4,integer *x5,integer *x6,
00017 integer *x7,double *dx1,double *dx2,double *dx3,double *dx4,
00018 integer lx0, integer lx1) ;
00019
00020 static void block_draw_rect_1(double r[],double percent)
00021 {
00022 integer alumode,verbose=0,narg;
00023 static integer in=6;
00024 double w = r[2]*percent;
00025 double x = r[0];
00026 C2F(dr)("xget","alufunction",&verbose,&alumode,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00027 if ( alumode != in ) C2F(dr1)("xset","alufunction",&in,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00028 C2F(dr1)("xfrect","v",PI0,PI0,PI0,PI0,PI0,PI0,&x,r+1,&w,r+3,0L,0L);
00029 if ( alumode != in ) C2F(dr1)("xset","alufunction",&alumode,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00030 }
00031
00032 static void block_draw_rect_2(double r[],double percent)
00033 {
00034 integer alumode,verbose=0,narg;
00035
00036 static integer in=6;
00037 double x = r[0]+ r[2]*percent-2;
00038 double w = 4;
00039 C2F(dr)("xget","alufunction",&verbose,&alumode,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00040 if ( alumode != in ) C2F(dr1)("xset","alufunction",&in,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00041 C2F(dr1)("xfrect","v",PI0,PI0,PI0,PI0,PI0,PI0,&x,r+1,&w,r+3,0L,0L);
00042
00043
00044
00045
00046 if ( alumode != in ) C2F(dr1)("xset","alufunction",&alumode,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00047 }
00048
00049
00050 static void block_draw_rect_3(double r[],double percent)
00051 {
00052 integer alumode,verbose=0,narg;
00053 integer flag =0; double ang=0.0; char foo[24];
00054 static integer in=6;
00055 double x = r[0] + (1.0/10)*r[2];
00056 double y = r[1] - r[3] + 2 ;
00057 C2F(dr)("xget","alufunction",&verbose,&alumode,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00058 if ( alumode != in ) C2F(dr1)("xset","alufunction",&in,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00059 sprintf(foo,"%5.3f",percent);
00060 C2F(dr1)("xstring",foo,PI0,PI0,PI0,&flag,PI0,PI0,&x,&y,&ang,PD0,0L,0L);
00061 if ( alumode != in ) C2F(dr1)("xset","alufunction",&alumode,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00062 }
00063
00064
00065
00066
00067
00068
00069
00070
00071 #define REMOVE_REC_DRIVER() char old_rec[4]; int rem_flag ; rem_flag = scig_driverX11(old_rec);
00072 #define RESTORE_DRIVER() if (rem_flag == 1) C2F(SetDriver)(old_rec,PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0);
00073
00074 static int scig_driverX11(char *old)
00075 {
00076 GetDriver1(old,PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0);
00077 if ( old[0] == 'R' )
00078 {
00079 C2F(SetDriver)("X11",PI0,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0);
00080 return 1;
00081 }
00082 return 0;
00083 }
00084
00085
00086
00087
00088
00089
00090 static int set_block_win( int win)
00091 {
00092 static int verbose = 0, cur,narg;
00093 C2F(dr)("xget","window",&verbose,&cur,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00094 if ( cur != win )
00095 C2F(dr)("xset","window",&win,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00096 return cur ;
00097 }
00098
00099
00100
00101
00102
00103
00104
00105 static int set_slider_color( int color)
00106 {
00107 static int verbose = 0, cur,narg;
00108 C2F(dr)("xget","color",&verbose,&cur,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00109 if ( cur != color )
00110 C2F(dr)("xset","color",&color,PI0,PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00111 return cur ;
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 void slider(integer *flag, integer *nevprt, double *t, double *xd,
00123 double *x, integer *nx, double *z, integer *nz,
00124 double *tvec, integer *ntvec, double *rpar,
00125 integer *nrpar, integer *ipar, integer *nipar,
00126 double * u, integer *nu, double * y, integer *ny)
00127 {
00128
00129 int wid, idb = 0 ;
00130 int cur;
00131 static double th=2 ;
00132 static double t3d = 4.0 ;
00133 int curcolor;
00134 if ( idb == 1 )
00135 sciprint("Slider t=%10.3f, flag=%d \r\n",*t,*flag);
00136
00137 switch ( *flag ) {
00138 case 2 :
00139
00140 wid= (int) z[1];
00141 if( wid < 0) return;
00142 cur = set_block_win(wid) ;
00143 {
00144 double val = Min(rpar[1],Max(rpar[0],u[0]));
00145 double percent = (val - rpar[0])/(rpar[1]-rpar[0]);
00146 if ( Abs(z[0] - percent) > 0.01 )
00147 {
00148 REMOVE_REC_DRIVER();
00149 curcolor=set_slider_color(ipar[1]);
00150 switch (ipar[0])
00151 {
00152 case 1 :
00153 block_draw_rect_1(z+2,z[0]);
00154 block_draw_rect_1(z+2,percent);
00155 break;
00156 case 2 :
00157 block_draw_rect_2(z+2,z[0]);
00158 block_draw_rect_2(z+2,percent);
00159 break;
00160 case 3 :
00161 block_draw_rect_3(z+2,z[0]);
00162 block_draw_rect_3(z+2,percent);
00163 break;
00164 }
00165 curcolor=set_slider_color(curcolor);
00166 z[0] = percent;
00167 RESTORE_DRIVER();
00168 }
00169 }
00170 set_block_win(cur);
00171 break;
00172 case 4 :
00173
00174 z[0]= 0.0;
00175 C2F(getgeom)(z+1);
00176 z[2] = z[2]+ t3d +th ;
00177 z[4] -= t3d + 2*th ;
00178 z[3] = z[3] + z[5] ;
00179 z[5] -= t3d ;
00180 wid= (int) z[1];
00181 if( wid < 0) return;
00182 cur = set_block_win(wid) ;
00183 {
00184 REMOVE_REC_DRIVER();
00185 curcolor=set_slider_color(ipar[1]);
00186 C2F(dr1)("xclea","v",PI0,PI0,PI0,PI0,PI0,PI0,z+2,z+3,z+4,z+5,0L,0L);
00187 switch (ipar[0])
00188 {
00189 case 1 :
00190 block_draw_rect_1(z+2,z[0]);
00191 break;
00192 case 2 :
00193 block_draw_rect_2(z+2,z[0]);
00194 break;
00195 case 3 :
00196 block_draw_rect_3(z+2,z[0]);
00197 break;
00198
00199 }
00200 curcolor=set_slider_color(curcolor);
00201 RESTORE_DRIVER();
00202 }
00203 set_block_win(cur);
00204 break;
00205 }
00206 }
00207