00001 #include "afni.h"
00002 #include <X11/keysym.h>
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 static int AFNI_drive_rescan_controller( char *code ) ;
00012 static int AFNI_drive_switch_session( char *cmd ) ;
00013 static int AFNI_drive_switch_anatomy( char *cmd ) ;
00014 static int AFNI_drive_switch_function( char *cmd ) ;
00015 static int AFNI_drive_open_window( char *cmd ) ;
00016 static int AFNI_drive_close_window( char *cmd ) ;
00017 static int AFNI_drive_quit( char *cmd ) ;
00018 
00019 static int AFNI_drive_save_jpeg( char *cmd ) ;      
00020 static int AFNI_drive_set_view( char *cmd ) ;       
00021 static int AFNI_drive_set_dicom_xyz( char *cmd ) ;  
00022 static int AFNI_drive_set_spm_xyz( char *cmd ) ;    
00023 static int AFNI_drive_set_ijk( char *cmd ) ;        
00024 static int AFNI_drive_set_xhairs( char *cmd ) ;     
00025 
00026 static int AFNI_drive_system( char *cmd ) ;         
00027 static int AFNI_drive_chdir ( char *cmd ) ;         
00028 
00029 #ifdef ALLOW_PLUGINS
00030 static int AFNI_drive_open_plugin( char *cmd ) ;    
00031 #endif
00032 
00033 static int AFNI_drive_open_graph_xy ( char *cmd ) ; 
00034 static int AFNI_drive_close_graph_xy( char *cmd ) ;
00035 static int AFNI_drive_clear_graph_xy( char *cmd ) ;
00036 static int AFNI_drive_addto_graph_xy( char *cmd ) ;
00037 
00038 static int AFNI_drive_open_graph_1D ( char *cmd ) ; 
00039 static int AFNI_drive_close_graph_1D( char *cmd ) ;
00040 static int AFNI_drive_clear_graph_1D( char *cmd ) ;
00041 static int AFNI_drive_addto_graph_1D( char *cmd ) ;
00042 
00043 static int AFNI_drive_geom_graph    ( char *cmd ) ; 
00044 
00045 static int AFNI_drive_add_overlay_color( char *cmd ) ; 
00046 static int AFNI_drive_set_threshold    ( char *cmd ) ; 
00047 static int AFNI_drive_set_threshnew    ( char *cmd ) ; 
00048 static int AFNI_drive_set_pbar_number  ( char *cmd ) ; 
00049 static int AFNI_drive_set_pbar_sign    ( char *cmd ) ; 
00050 static int AFNI_drive_set_pbar_all     ( char *cmd ) ; 
00051 static int AFNI_drive_pbar_rotate      ( char *cmd ) ; 
00052 static int AFNI_set_func_autorange     ( char *cmd ) ; 
00053 static int AFNI_set_func_range         ( char *cmd ) ; 
00054 static int AFNI_set_func_visible       ( char *cmd ) ; 
00055 static int AFNI_set_func_resam         ( char *cmd ) ; 
00056 static int AFNI_sleeper                ( char *cmd ) ; 
00057 static int AFNI_define_colorscale      ( char *cmd ) ; 
00058 static int AFNI_open_panel             ( char *cmd ) ; 
00059 static int AFNI_drive_purge_memory     ( char *cmd ) ; 
00060 static int AFNI_redisplay              ( char *cmd ) ;
00061 
00062 
00063 
00064 
00065 
00066 
00067 typedef int dfunc(char *) ;
00068 
00069   
00070 
00071 typedef struct { char *nam; dfunc *fun; } AFNI_driver_pair ;
00072 
00073 static AFNI_driver_pair dpair[] = {
00074  { "RESCAN_THIS"      , AFNI_drive_rescan_controller } ,
00075 
00076  { "SET_SESSION"      , AFNI_drive_switch_session    } ,
00077  { "SWITCH_SESSION"   , AFNI_drive_switch_session    } ,
00078  { "SWITCH_DIRECTORY" , AFNI_drive_switch_session    } ,
00079 
00080  { "SET_ANATOMY"      , AFNI_drive_switch_anatomy    } ,
00081  { "SWITCH_ANATOMY"   , AFNI_drive_switch_anatomy    } ,
00082  { "SWITCH_UNDERLAY"  , AFNI_drive_switch_anatomy    } ,
00083  { "SET_UNDERLAY"     , AFNI_drive_switch_anatomy    } ,
00084 
00085  { "SET_FUNCTION"     , AFNI_drive_switch_function   } ,
00086  { "SWITCH_FUNCTION"  , AFNI_drive_switch_function   } ,
00087  { "SWITCH_OVERLAY"   , AFNI_drive_switch_function   } ,
00088  { "SET_OVERLAY"      , AFNI_drive_switch_function   } ,
00089 
00090  { "PURGE_MEMORY"     , AFNI_drive_purge_memory      } ,
00091 
00092  { "OPEN_WINDOW"      , AFNI_drive_open_window       } ,
00093  { "ALTER_WINDOW"     , AFNI_drive_open_window       } ,
00094  { "CLOSE_WINDOW"     , AFNI_drive_close_window      } ,
00095 
00096  { "SAVE_JPEG"        , AFNI_drive_save_jpeg         } ,
00097  { "SET_VIEW"         , AFNI_drive_set_view          } ,
00098  { "SET_DICOM_XYZ"    , AFNI_drive_set_dicom_xyz     } ,
00099  { "SET_SPM_XYZ"      , AFNI_drive_set_spm_xyz       } ,
00100  { "SET_IJK"          , AFNI_drive_set_ijk           } ,
00101  { "SET_XHAIRS"       , AFNI_drive_set_xhairs        } ,
00102  { "SET_CROSSHAIRS"   , AFNI_drive_set_xhairs        } ,
00103 
00104  { "OPEN_GRAPH_XY"    , AFNI_drive_open_graph_xy     } ,
00105  { "CLOSE_GRAPH_XY"   , AFNI_drive_close_graph_xy    } ,
00106  { "CLEAR_GRAPH_XY"   , AFNI_drive_clear_graph_xy    } ,
00107  { "ADDTO_GRAPH_XY"   , AFNI_drive_addto_graph_xy    } ,
00108 
00109  { "OPEN_GRAPH_1D"    , AFNI_drive_open_graph_1D     } ,
00110  { "CLOSE_GRAPH_1D"   , AFNI_drive_close_graph_1D    } ,
00111  { "CLEAR_GRAPH_1D"   , AFNI_drive_clear_graph_1D    } ,
00112  { "ADDTO_GRAPH_1D"   , AFNI_drive_addto_graph_1D    } ,
00113 
00114  { "SET_GRAPH_GEOM"   , AFNI_drive_geom_graph        } ,
00115 
00116  { "QUIT"             , AFNI_drive_quit              } ,
00117 
00118  { "SYSTEM"           , AFNI_drive_system            } ,
00119  { "CHDIR"            , AFNI_drive_chdir             } ,
00120 
00121  { "ADD_OVERLAY_COLOR"  , AFNI_drive_add_overlay_color } ,
00122  { "SET_THRESHOLD"      , AFNI_drive_set_threshold     } ,
00123  { "SET_THRESHNEW"      , AFNI_drive_set_threshnew     } ,
00124  { "SET_FUNC_THRESH"    , AFNI_drive_set_threshold     } ,
00125  { "SET_PBAR_NUMBER"    , AFNI_drive_set_pbar_number   } ,
00126  { "SET_PBAR_SIGN"      , AFNI_drive_set_pbar_sign     } ,
00127  { "SET_PBAR_ALL"       , AFNI_drive_set_pbar_all      } ,
00128  { "PBAR_ROTATE"        , AFNI_drive_pbar_rotate       } ,
00129  { "SET_FUNC_AUTORANGE" , AFNI_set_func_autorange      } ,
00130  { "SET_FUNC_RANGE"     , AFNI_set_func_range          } ,
00131  { "SET_FUNC_VISIBLE"   , AFNI_set_func_visible        } ,
00132  { "SEE_OVERLAY"        , AFNI_set_func_visible        } ,
00133  { "SET_FUNC_RESAM"     , AFNI_set_func_resam          } ,
00134  { "SLEEP"              , AFNI_sleeper                 } ,
00135  { "SETENV"             , AFNI_setenv                  } ,  
00136  { "DEFINE_COLORSCALE"  , AFNI_define_colorscale       } ,
00137  { "DEFINE_COLOR_SCALE" , AFNI_define_colorscale       } ,
00138  { "OPEN_PANEL"         , AFNI_open_panel              } ,
00139 
00140  { "REDISPLAY"          , AFNI_redisplay               } ,
00141  { "REDRAW"             , AFNI_redisplay               } ,
00142 
00143  { NULL , NULL } } ;
00144 
00145 
00146 
00147 int AFNI_driver( char *cmdd )
00148 {
00149    int clen , rval , ii , dd , dlen ;
00150    char *cmd , *dmd ;
00151 
00152 ENTRY("AFNI_driver") ;
00153 
00154    if( cmdd == NULL || *cmdd == '\0' ) RETURN(-1) ;  
00155 
00156    dmd = cmd = strdup(cmdd) ; clen = strlen(cmd) ;
00157 
00158    
00159 
00160    for( ii=0 ; ii < clen ; ii++ )
00161       if( !isspace(cmd[ii]) ) break ;
00162 
00163    if( ii == clen ){ free(dmd); RETURN(-1); }  
00164 
00165    cmd += ii ; clen = strlen(cmd) ;
00166 
00167    
00168 
00169    for( ii=clen-1 ; ii > 0 && isspace(cmd[ii]) ; ii-- )
00170      cmd[ii] = '\0' ;
00171 
00172    clen = strlen(cmd) ;
00173 
00174    
00175 
00176    for( dd=0 ; dpair[dd].nam != NULL ; dd++ ){
00177 
00178       dlen = strlen(dpair[dd].nam) ;
00179       if( clen >= dlen                         &&
00180           strncmp(cmd,dpair[dd].nam,dlen) == 0   ){  
00181 
00182          for( ii=dlen ; ii < clen ; ii++ )      
00183             if( !isspace(cmd[ii]) ) break ;     
00184 
00185          rval = dpair[dd].fun( cmd+ii ) ;       
00186          free(dmd) ; RETURN(rval) ;
00187       }
00188    }
00189 
00190    free(dmd) ; RETURN(-1) ;  
00191 }
00192 
00193 
00194 
00195 
00196 int AFNI_drive_purge_memory( char *cmd )  
00197 {
00198    char dname[THD_MAX_NAME] ;
00199    THD_slist_find slf ;
00200    int ic ;
00201 
00202 ENTRY("AFNI_drive_purge_memory") ;
00203 
00204    if( *cmd == '\0' ){ AFNI_purge_dsets(1); RETURN(0); }
00205 
00206    
00207 
00208    MCW_strncpy( dname , cmd , THD_MAX_NAME ) ;
00209    for( ic=strlen(dname)-1 ; ic >= 0 ; ic-- )
00210      if( isspace(dname[ic]) || iscntrl(dname[ic]) ) dname[ic] = '\0' ;
00211      else break ;
00212 
00213    if( strlen(dname) == 0 ) RETURN(-1) ;
00214 
00215    
00216 
00217    slf = THD_dset_in_sessionlist( FIND_PREFIX, dname, GLOBAL_library.sslist,-1 );
00218 
00219    if( slf.dset_index < 0 ){   
00220      MCW_idcode idcode ;
00221      MCW_strncpy( idcode.str , dname , MCW_IDSIZE ) ;
00222      slf = THD_dset_in_sessionlist( FIND_IDCODE, &idcode,
00223                                     GLOBAL_library.sslist,-1 );
00224    }
00225 
00226    if( slf.sess_index >= 0 && slf.dset_index >= 0 ){
00227      THD_3dim_dataset **dss =
00228        GLOBAL_library.sslist->ssar[slf.sess_index]->dsset[slf.dset_index] ;
00229      for( ic=0 ; ic <= LAST_VIEW_TYPE ; ic++ ) PURGE_DSET( dss[ic] ) ;
00230      RETURN(0) ;
00231    }
00232 
00233    RETURN(-1) ;
00234 }
00235 
00236 
00237 
00238 
00239 int AFNI_drive_system( char *cmd )  
00240 {
00241    return system( cmd ) ;
00242 }
00243 
00244 
00245 
00246 
00247 int AFNI_drive_chdir( char *cmd )   
00248 {
00249    return chdir( cmd ) ;
00250 }
00251 
00252 
00253 
00254 
00255 
00256 
00257 
00258 
00259 
00260 
00261 
00262 int AFNI_controller_code_to_index( char *code )
00263 {
00264    int ic ;
00265 ENTRY("AFNI_controller_code_to_index") ;
00266    if( code    == NULL || *code   == '\0' ) RETURN(-1) ;
00267    if( code[1] != '\0' && code[1] != '.' && code[1] != ' ' ) RETURN(-1) ;
00268    ic = *code - 'A' ;
00269    if( ic < 0 || ic >= MAX_CONTROLLERS ) ic = -1 ;
00270    RETURN(ic) ;
00271 }
00272 
00273 
00274 
00275 
00276 
00277 
00278 static int AFNI_drive_rescan_controller( char *code )
00279 {
00280    int ic ;
00281    Three_D_View *im3d ;
00282 
00283 ENTRY("AFNI_rescan_controller") ;
00284 
00285    ic = AFNI_controller_code_to_index( code ) ;
00286    if( ic < 0 ) ic = 0 ;                       
00287 
00288    im3d = GLOBAL_library.controllers[ic] ;
00289    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;
00290 
00291    
00292 
00293    AFNI_rescan_CB( NULL , (XtPointer)im3d , NULL ) ;
00294    RETURN(0) ;
00295 }
00296 
00297 
00298 
00299 
00300 
00301 
00302 
00303 static int AFNI_drive_switch_session( char *cmd )
00304 {
00305    int ic , dadd=2 ;
00306    Three_D_View *im3d ;
00307    char dname[THD_MAX_NAME] ;
00308    MCW_choose_cbs cbs ;
00309 
00310 ENTRY("AFNI_switch_session") ;
00311 
00312    if( cmd == NULL || strlen(cmd) < 3 ) RETURN(-1) ;
00313 
00314    ic = AFNI_controller_code_to_index( cmd ) ;
00315    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
00316 
00317    im3d = GLOBAL_library.controllers[ic] ;
00318    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;
00319 
00320    
00321 
00322    MCW_strncpy( dname , cmd+dadd , THD_MAX_NAME ) ;
00323    for( ic=strlen(dname)-1 ; ic >= 0 ; ic-- )
00324       if( isspace(dname[ic]) || iscntrl(dname[ic]) ) dname[ic] = '\0' ;
00325       else break ;
00326 
00327    if( strlen(dname) == 0 ) RETURN(-1) ;
00328 
00329    
00330 
00331    for( ic=0 ; ic < GLOBAL_library.sslist->num_sess ; ic++ )
00332       if( strstr(GLOBAL_library.sslist->ssar[ic]->sessname,dname) != NULL ) break;
00333 
00334    if( ic == GLOBAL_library.sslist->num_sess ) RETURN(-1) ;
00335 
00336    
00337 
00338    cbs.ival = ic ;
00339 
00340    AFNI_finalize_dataset_CB( im3d->vwid->view->choose_sess_pb ,
00341                              (XtPointer)im3d ,  &cbs          ) ;
00342 
00343    RETURN(0) ;
00344 }
00345 
00346 
00347 
00348 
00349 
00350 
00351 static int AFNI_drive_switch_anatomy( char *cmd )
00352 {
00353    int ic , dadd=2 ;
00354    Three_D_View *im3d ;
00355    char dname[THD_MAX_NAME] ;
00356    MCW_choose_cbs cbs ;
00357    THD_slist_find slf ;
00358 
00359 ENTRY("AFNI_switch_anatomy") ;
00360 
00361    if( cmd == NULL || strlen(cmd) < 3 ) RETURN(-1) ;
00362 
00363    ic = AFNI_controller_code_to_index( cmd ) ;
00364    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
00365 
00366    im3d = GLOBAL_library.controllers[ic] ;
00367    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;
00368 
00369    
00370 
00371    MCW_strncpy( dname , cmd+dadd , THD_MAX_NAME ) ;
00372    for( ic=strlen(dname)-1 ; ic >= 0 ; ic-- )
00373      if( isspace(dname[ic]) || iscntrl(dname[ic]) ) dname[ic] = '\0' ;
00374      else break ;
00375 
00376    if( strlen(dname) == 0 ) RETURN(-1) ;
00377 
00378    
00379 
00380    slf = THD_dset_in_session( FIND_PREFIX , dname , im3d->ss_now ) ;
00381 
00382    if( slf.dset_index < 0 ){   
00383      MCW_idcode idcode ;
00384      MCW_strncpy( idcode.str , dname , MCW_IDSIZE ) ;
00385      slf = THD_dset_in_session( FIND_IDCODE , &idcode , im3d->ss_now ) ;
00386    }
00387 
00388    if( slf.dset_index < 0 ) RETURN(-1) ;
00389 
00390    cbs.ival = slf.dset_index ;
00391 
00392    
00393 
00394    AFNI_finalize_dataset_CB( im3d->vwid->view->choose_anat_pb ,
00395                              (XtPointer)im3d ,  &cbs          ) ;
00396 
00397    RETURN(0) ;
00398 }
00399 
00400 
00401 
00402 
00403 
00404 
00405 static int AFNI_drive_switch_function( char *cmd )
00406 {
00407    int ic , dadd=2 ;
00408    Three_D_View *im3d ;
00409    char dname[THD_MAX_NAME] ;
00410    MCW_choose_cbs cbs ;
00411    THD_slist_find slf ;
00412 
00413 ENTRY("AFNI_switch_function") ;
00414 
00415    if( cmd == NULL || strlen(cmd) < 3 ) RETURN(-1) ;
00416 
00417    ic = AFNI_controller_code_to_index( cmd ) ;
00418    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
00419 
00420    im3d = GLOBAL_library.controllers[ic] ;
00421    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;
00422 
00423    
00424 
00425    MCW_strncpy( dname , cmd+dadd , THD_MAX_NAME ) ;
00426    for( ic=strlen(dname)-1 ; ic >= 0 ; ic-- )
00427       if( isspace(dname[ic]) || iscntrl(dname[ic]) ) dname[ic] = '\0' ;
00428       else break ;
00429 
00430    if( strlen(dname) == 0 ) RETURN(-1) ;
00431 
00432    
00433 
00434    slf = THD_dset_in_session( FIND_PREFIX , dname , im3d->ss_now ) ;
00435 
00436    if( slf.dset_index < 0 ){   
00437      MCW_idcode idcode ;
00438      MCW_strncpy( idcode.str , dname , MCW_IDSIZE ) ;
00439      slf = THD_dset_in_session( FIND_IDCODE , &idcode , im3d->ss_now ) ;
00440    }
00441 
00442    if( slf.dset_index < 0 ) RETURN(-1) ;
00443 
00444    cbs.ival = slf.dset_index ;
00445 
00446    
00447 
00448    AFNI_finalize_dataset_CB( im3d->vwid->view->choose_func_pb ,
00449                              (XtPointer)im3d ,  &cbs          ) ;
00450 
00451    RETURN(0) ;
00452 }
00453 
00454 
00455 
00456 
00457 
00458 
00459 
00460 static int AFNI_drive_open_window( char *cmd )
00461 {
00462    int ic ;
00463    Three_D_View *im3d ;
00464    char *cpt ;
00465    int gww=-1,ghh=-1,gxx=-1,gyy=-1 ;
00466    MCW_imseq   *isq=NULL ;
00467    MCW_grapher *gra=NULL ;
00468 
00469 ENTRY("AFNI_drive_open_window") ;
00470 
00471    
00472 
00473    ic = AFNI_controller_code_to_index( cmd ) ;
00474    if( ic < 0 ) ic = 0 ;
00475 
00476    im3d = GLOBAL_library.controllers[ic] ;
00477    if( !IM3D_VALID(im3d) ){                  
00478       AFNI_make_controller( ic ) ;
00479       im3d = GLOBAL_library.controllers[ic] ;
00480       if( !IM3D_VALID(im3d) ) RETURN(-1) ;   
00481    }
00482 
00483    if( !IM3D_OPEN(im3d) ){                   
00484       OPEN_CONTROLLER(im3d) ;
00485       AFNI_initialize_controller( im3d ) ;   
00486       AFNI_initialize_view( NULL , im3d ) ;  
00487       AFNI_controller_clonify() ;
00488    }
00489 
00490    if( strlen(cmd) < 3 ) RETURN(0) ;         
00491 
00492    
00493 
00494 #ifdef ALLOW_PLUGINS
00495    if( strstr(cmd,"plugin.") != NULL ){
00496       ic = AFNI_drive_open_plugin( cmd ) ;
00497       RETURN(ic) ;
00498    }
00499 #endif
00500 
00501    
00502 
00503         if( strstr(cmd,"axialimage") != NULL ){
00504           AFNI_view_xyz_CB( im3d->vwid->imag->image_xyz_pb, im3d, NULL ) ;
00505           isq = im3d->s123 ;
00506 
00507    } else if( strstr(cmd,"sagittalimage") != NULL ){
00508           AFNI_view_xyz_CB( im3d->vwid->imag->image_yzx_pb, im3d, NULL ) ;
00509           isq = im3d->s231 ;
00510 
00511    } else if( strstr(cmd,"coronalimage") != NULL ){
00512           AFNI_view_xyz_CB( im3d->vwid->imag->image_zxy_pb, im3d, NULL ) ;
00513           isq = im3d->s312 ;
00514 
00515    } else if( strstr(cmd,"axialgraph") != NULL ){
00516           AFNI_view_xyz_CB( im3d->vwid->imag->graph_xyz_pb, im3d, NULL ) ;
00517           gra = im3d->g123 ;
00518 
00519    } else if( strstr(cmd,"sagittalgraph") != NULL ){
00520           AFNI_view_xyz_CB( im3d->vwid->imag->graph_yzx_pb, im3d, NULL ) ;
00521           gra = im3d->g231 ;
00522 
00523    } else if( strstr(cmd,"coronalgraph") != NULL ){
00524           AFNI_view_xyz_CB( im3d->vwid->imag->graph_zxy_pb, im3d, NULL ) ;
00525           gra = im3d->g312 ;
00526    }
00527    XmUpdateDisplay( im3d->vwid->top_shell ) ;
00528 
00529    
00530 
00531    cpt = strstr(cmd,"geom=") ;
00532    if( cpt == NULL ) cpt = strstr(cmd,"geom:") ;
00533    if( cpt != NULL )
00534      AFNI_decode_geom( cpt+5 , &gww,&ghh,&gxx,&gyy ) ;
00535 
00536    
00537 
00538    if( isq != NULL ){
00539 
00540       
00541 
00542       if( gxx >= 0 && gyy >= 0 )
00543         XtVaSetValues( isq->wtop, XmNx, gxx, XmNy, gyy, NULL ) ;
00544       if( gww > 0 && ghh > 0 )
00545         XtVaSetValues( isq->wtop, XmNwidth, gww, XmNheight, ghh, NULL ) ;
00546 
00547       
00548 
00549       cpt = strstr(cmd,"ifrac=") ;
00550       if( cpt == NULL ) cpt = strstr(cmd,"ifrac:") ;
00551       if( cpt != NULL ){
00552         float ifrac = strtod( cpt+6 , NULL ) ;
00553         if( ifrac >= FRAC_MIN && ifrac <= 1.0 )
00554           drive_MCW_imseq( isq, isqDR_setifrac, (XtPointer)(&ifrac) ) ;
00555       }
00556 
00557       
00558 
00559       cpt = strstr(cmd,"mont=") ;
00560       if( cpt == NULL ) cpt = strstr(cmd,"mont:") ;
00561       if( cpt != NULL ){
00562         int mww=-1 , mhh=-1 , msp=-1 , mgap=-1 , nn ;
00563         char mcol[128] = "\0" ;
00564 
00565         nn = sscanf( cpt+5 , "%dx%d:%d:%d:%s" , &mww,&mhh,&msp,&mgap,mcol );
00566 
00567         if( nn >= 2 && mww >= 1 && mww <= MONT_NMAX && mhh >= 1 && mhh <= MONT_NMAX ){
00568           int mp[5] ;
00569           mp[0] = mww ; mp[1] = mhh ; mp[2] = msp ; mp[3] = mgap ;
00570           mp[4] = DC_find_overlay_color(im3d->dc,mcol);
00571           drive_MCW_imseq( isq , isqDR_setmontage , (XtPointer)mp ) ;
00572         }
00573       }
00574 
00575       
00576 
00577       cpt = strstr(cmd,"iconi") ;
00578       if( cpt != NULL ){
00579         XIconifyWindow( XtDisplay(isq->wtop) ,
00580                          XtWindow(isq->wtop)  ,
00581                          isq->dc->screen_num   ) ;
00582       }
00583 
00584       
00585 
00586       cpt = strstr(cmd,"opacity=") ;
00587       if( cpt == NULL ) cpt = strstr(cmd,"opacity:") ;
00588       if( cpt != NULL ){
00589         int opaval = -1 ;
00590         sscanf( cpt+8 , "%d" , &opaval ) ;
00591         drive_MCW_imseq( isq , isqDR_setopacity , (XtPointer)opaval ) ;
00592       }
00593 
00594       
00595 
00596       cpt = strstr(cmd,"keypress=") ;
00597       if( cpt == NULL ) cpt = strstr(cmd,"keypress:") ;
00598       if( cpt != NULL ){
00599         unsigned long key ;
00600         cpt += 9 ;
00601         if( *cpt == '\'' || *cpt == '\"' ) cpt++ ;
00602              if( strncmp(cpt,"XK_Left"     , 7) == 0 ) key = XK_Left     ;
00603         else if( strncmp(cpt,"XK_Right"    , 8) == 0 ) key = XK_Right    ;
00604         else if( strncmp(cpt,"XK_Down"     , 7) == 0 ) key = XK_Down     ;
00605         else if( strncmp(cpt,"XK_Up"       , 5) == 0 ) key = XK_Up       ;
00606         else if( strncmp(cpt,"XK_Page_Up"  ,10) == 0 ) key = XK_Page_Up  ;
00607         else if( strncmp(cpt,"XK_Page_Down",12) == 0 ) key = XK_Page_Down;
00608         else if( strncmp(cpt,"XK_Delete"   , 9) == 0 ) key = XK_Delete   ;
00609         else if( strncmp(cpt,"XK_Home"     , 7) == 0 ) key = XK_Home     ;
00610         else if( strncmp(cpt,"XK_F2"       , 5) == 0 ) key = XK_F2       ;
00611         else if( strncmp(cpt,"XK_F3"       , 5) == 0 ) key = XK_F3       ;
00612         else if( strncmp(cpt,"XK_F4"       , 5) == 0 ) key = XK_F4       ;
00613         else if( strncmp(cpt,"XK_F5"       , 5) == 0 ) key = XK_F5       ;
00614         else if( strncmp(cpt,"XK_F6"       , 5) == 0 ) key = XK_F6       ;
00615         else if( strncmp(cpt,"XK_F7"       , 5) == 0 ) key = XK_F7       ;
00616         else if( strncmp(cpt,"XK_F8"       , 5) == 0 ) key = XK_F8       ;
00617         else if( strncmp(cpt,"XK_F9"       , 5) == 0 ) key = XK_F9       ;
00618         else if( strncmp(cpt,"XK_F10"      , 6) == 0 ) key = XK_F10      ;
00619         else if( strncmp(cpt,"XK_F11"      , 6) == 0 ) key = XK_F11      ;
00620         else if( strncmp(cpt,"XK_F12"      , 6) == 0 ) key = XK_F12      ;
00621         else                                           key = *cpt        ;
00622         ISQ_handle_keypress( isq , key ) ;
00623       }
00624 
00625    
00626 
00627    } else if( gra != NULL ){
00628 
00629       
00630 
00631       if( gxx >= 0 && gyy >= 0 )
00632         XtVaSetValues( gra->fdw_graph, XmNx, gxx, XmNy, gyy, NULL ) ;
00633       if( gww > 0 && ghh > 0 )
00634         XtVaSetValues( gra->fdw_graph, XmNwidth, gww, XmNheight, ghh, NULL ) ;
00635 
00636       
00637 
00638       cpt = strstr(cmd,"matrix=") ;
00639       if( cpt == NULL ) cpt = strstr(cmd,"matrix:") ;
00640       if( cpt != NULL ){
00641         int mat = (int) strtod( cpt+7 , NULL ) ;
00642         if( mat > 0 )
00643           drive_MCW_grapher( gra , graDR_setmatrix , (XtPointer)mat ) ;
00644       }
00645 
00646       
00647 
00648       cpt = strstr(cmd,"pinnum=") ;
00649       if( cpt == NULL ) cpt = strstr(cmd,"pinnum:") ;
00650       if( cpt == NULL ) cpt = strstr(cmd,"pintop=") ;
00651       if( cpt == NULL ) cpt = strstr(cmd,"pintop:") ;
00652       if( cpt != NULL ){
00653         int pn = (int) strtod( cpt+7 , NULL ) ;
00654         if( pn >= MIN_PIN )
00655           drive_MCW_grapher( gra, graDR_setpinnum, (XtPointer)pn ) ;
00656       }
00657 
00658       
00659 
00660       cpt = strstr(cmd,"pinbot=") ;
00661       if( cpt == NULL ) cpt = strstr(cmd,"pinbot:") ;
00662       if( cpt != NULL ){
00663         int pn = (int) strtod( cpt+7 , NULL ) ;
00664         if( pn > 0 )
00665           drive_MCW_grapher( gra, graDR_setpinbot, (XtPointer)pn ) ;
00666       }
00667 
00668       
00669 
00670       cpt = strstr(cmd,"iconi") ;
00671       if( cpt != NULL ){
00672         XIconifyWindow( XtDisplay(gra->fdw_graph) ,
00673                          XtWindow(gra->fdw_graph)  ,
00674                          gra->dc->screen_num   ) ;
00675       }
00676 
00677       
00678 
00679       cpt = strstr(cmd,"keypress=") ;
00680       if( cpt == NULL ) cpt = strstr(cmd,"keypress:") ;
00681       if( cpt != NULL ){
00682         char buf[2] ;
00683         cpt += 9 ;
00684         if( *cpt == '\'' || *cpt == '\"' ) cpt++ ;
00685              if( strncmp(cpt,"XK_Left" ,7) == 0 ) buf[0] = '<'  ;
00686         else if( strncmp(cpt,"XK_Right",8) == 0 ) buf[0] = '>'  ;
00687         else if( strncmp(cpt,"XK_Down" ,7) == 0 ) buf[0] = 'Z'  ;
00688         else if( strncmp(cpt,"XK_Up"   ,5) == 0 ) buf[0] = 'z'  ;
00689         else                                      buf[0] = *cpt ;
00690         if( buf[0] == 'N' ) buf[0] = '\0' ;  
00691         buf[1] = '\0' ;
00692         GRA_timer_stop( gra ) ;
00693         GRA_handle_keypress( gra , buf , NULL ) ;
00694       }
00695 
00696 
00697    
00698 
00699    } else {
00700 
00701       
00702 
00703       if( gxx >= 0 && gyy >= 0 )
00704         XtVaSetValues( im3d->vwid->top_shell, XmNx, gxx, XmNy, gyy, NULL ) ;
00705 
00706       
00707 
00708       cpt = strstr(cmd,"iconi") ;
00709       if( cpt != NULL ){
00710         XIconifyWindow( XtDisplay(im3d->vwid->top_shell) ,
00711                          XtWindow(im3d->vwid->top_shell)  ,
00712                          im3d->dc->screen_num   ) ;
00713       }
00714 
00715    }
00716 
00717    
00718 
00719    XmUpdateDisplay( im3d->vwid->top_shell ) ;
00720    RETURN(0) ;
00721 }
00722 
00723 
00724 
00725 
00726 
00727 
00728 
00729 
00730 static int AFNI_drive_close_window( char *cmd )
00731 {
00732    int ic ;
00733    Three_D_View *im3d ;
00734 
00735 ENTRY("AFNI_drive_close_window") ;
00736 
00737    
00738 
00739    ic = AFNI_controller_code_to_index( cmd ) ;
00740    if( ic < 0 ) ic = 0 ;
00741 
00742    im3d = GLOBAL_library.controllers[ic] ;
00743    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;       
00744 
00745    if( strlen(cmd) < 3 ){                    
00746       if( AFNI_count_controllers() > 1 ){    
00747          CLOSE_CONTROLLER(im3d); RETURN(0);  
00748       }
00749       RETURN(-1) ;                           
00750    }
00751 
00752    
00753 
00754         if( strstr(cmd,"axialimage") != NULL )
00755           drive_MCW_imseq( im3d->s123 , isqDR_destroy , NULL ) ;
00756 
00757    else if( strstr(cmd,"sagittalimage") != NULL )
00758           drive_MCW_imseq( im3d->s231 , isqDR_destroy , NULL ) ;
00759 
00760    else if( strstr(cmd,"coronalimage") != NULL )
00761           drive_MCW_imseq( im3d->s312 , isqDR_destroy , NULL ) ;
00762 
00763    else if( strstr(cmd,"axialgraph") != NULL )
00764           drive_MCW_grapher( im3d->g123 , graDR_destroy , NULL ) ;
00765 
00766    else if( strstr(cmd,"sagittalgraph") != NULL )
00767           drive_MCW_grapher( im3d->g231 , graDR_destroy , NULL ) ;
00768 
00769    else if( strstr(cmd,"coronalgraph") != NULL )
00770           drive_MCW_grapher( im3d->g312 , graDR_destroy , NULL ) ;
00771 
00772    else
00773           RETURN(-1) ;
00774 
00775    XmUpdateDisplay( im3d->vwid->top_shell ) ;
00776    RETURN(0) ;
00777 }
00778 
00779 
00780 
00781 
00782 
00783 #ifdef ALLOW_PLUGINS
00784 static int AFNI_drive_open_plugin( char *cmd )
00785 {
00786    int ic , ipl , ll , pl , qq ;
00787    Three_D_View *im3d ;
00788    char *cpt ;
00789    int gww=-1,ghh=-1,gxx=-1,gyy=-1 ;
00790 
00791    int      npbut              ;       
00792    char **  pluglab            ;       
00793    PLUGIN_interface ** plugint ;       
00794 
00795 ENTRY("AFNI_drive_open_plugin") ;
00796 
00797    
00798 
00799 
00800    ic = AFNI_controller_code_to_index( cmd ) ;
00801    if( ic < 0 ) ic = 0 ;
00802    im3d = GLOBAL_library.controllers[ic] ;
00803 
00804    cpt = strstr(cmd,"plugin.") ;
00805    if( cpt == NULL || strlen(cpt) < 9 ) RETURN(-1) ;
00806    cpt += 7 ;  
00807    pl   = strlen(cpt) ;
00808 
00809    
00810 
00811    npbut   = im3d->vwid->nplugbut; if( npbut < 1 ) RETURN(-1) ;
00812    pluglab = im3d->vwid->pluglab ;
00813    plugint = im3d->vwid->plugint ;
00814 
00815    
00816 
00817    for( ipl=0 ; ipl < npbut ; ipl++ ){
00818       for( ll=strlen(pluglab[ipl]) ;   
00819            ll >= 0 && isspace(pluglab[ipl][ll]) ; ll-- ) ; 
00820       if( ll < 0 ) continue ;                        
00821       if( pl < ll ) continue ;                       
00822       for( qq=0 ; qq < ll ; qq++ )                   
00823          if( !isspace(pluglab[ipl][qq]) && cpt[qq]!=pluglab[ipl][qq] ) break ;
00824       if( qq == ll ) break ;  
00825    }
00826 
00827    if( ipl >= npbut ) RETURN(-1) ;  
00828 
00829    
00830 
00831    PLUG_startup_plugin_CB( im3d->vwid->plugbut[ipl] , plugint[ipl] , NULL ) ;
00832 
00833    
00834 
00835    cpt = strstr(cmd,"geom=") ;
00836    if( cpt == NULL ) cpt = strstr(cmd,"geom:") ;
00837    if( cpt != NULL )
00838       AFNI_decode_geom( cpt+5 , &gww,&ghh,&gxx,&gyy ) ;
00839 
00840    if( gxx >= 0                         &&
00841        gyy >= 0                         &&
00842        plugint[ipl]->wid        != NULL &&
00843        plugint[ipl]->wid->shell != NULL   ){
00844 
00845        XtVaSetValues( plugint[ipl]->wid->shell,
00846                       XmNx , gxx , XmNy , gyy , NULL ) ;
00847    }
00848 
00849    XmUpdateDisplay( im3d->vwid->top_shell ) ;
00850    RETURN(0) ;
00851 }
00852 #endif
00853 
00854 
00855 
00856 static int AFNI_drive_quit( char *cmd )
00857 {
00858   int ii ;
00859   fprintf(stderr,"\n******* AFNI is commanded to quit! ") ; fflush(stderr) ;
00860   for( ii=0 ; ii < 7 ; ii++ ){ RWC_sleep(100); fprintf(stderr,"*"); fflush(stderr); }
00861   fprintf(stderr,"\n\n") ;
00862   exit(0) ;
00863 }
00864 
00865 
00866 
00867 
00868 
00869 
00870 
00871 
00872 
00873 #include "coxplot.h"
00874 
00875 typedef struct {
00876    char gname[THD_MAX_NAME] ;  
00877    int ny ;                    
00878    float xbot,xtop ,           
00879          ybot,ytop  ;
00880 
00881    int num_pt ;                
00882    int num_mpinit ;            
00883 
00884    MEM_topshell_data *mp ; 
00885 
00886    float last_x ;          
00887    float *last_y ;
00888 } Graph_xy ;
00889 
00890 
00891 
00892 static int        num_Graph_xy  = 0 ;     
00893 static Graph_xy **Graph_xy_list = NULL ;  
00894 
00895 
00896 
00897 
00898 
00899 static int find_graph_xy_name( char *name )
00900 {
00901    int ii ;
00902 
00903    if( name == NULL || name[0] == '\0' ) return -1 ;
00904 
00905    for( ii=0 ; ii < num_Graph_xy ; ii++ )
00906       if( Graph_xy_list[ii] != NULL                  &&
00907           strcmp(Graph_xy_list[ii]->gname,name) == 0   ) return ii ;
00908 
00909    return -1 ;
00910 }
00911 
00912 
00913 
00914 
00915 
00916 
00917 static int find_empty_graph_xy(void)
00918 {
00919    int ii ;
00920 
00921    
00922 
00923    if( Graph_xy_list == NULL ){
00924       Graph_xy_list    = (Graph_xy **) malloc(sizeof(Graph_xy *)) ;
00925       Graph_xy_list[0] = NULL ;
00926       num_Graph_xy     = 1 ;
00927       return 0 ;
00928    }
00929 
00930    
00931 
00932    for( ii=0 ; ii < num_Graph_xy ; ii++ )
00933       if( Graph_xy_list[ii] == NULL ) return ii ;
00934 
00935    
00936 
00937    Graph_xy_list = (Graph_xy **) realloc( Graph_xy_list ,
00938                                           sizeof(Graph_xy *)*(num_Graph_xy+1) ) ;
00939    Graph_xy_list[num_Graph_xy] = NULL ;
00940    num_Graph_xy++ ;
00941    return (num_Graph_xy-1) ;
00942 }
00943 
00944 
00945 
00946 
00947 
00948 static void kill_graph_xy( MEM_topshell_data * mp )
00949 {
00950    int ii ;
00951 
00952    if( mp == NULL || Graph_xy_list == NULL ) return ;
00953 
00954    
00955 
00956    for( ii=0 ; ii < num_Graph_xy ; ii++ )
00957       if( Graph_xy_list[ii]     != NULL &&
00958           Graph_xy_list[ii]->mp == mp     ) break ;
00959 
00960    if( ii >= num_Graph_xy ) return ;  
00961 
00962    
00963 
00964    if( Graph_xy_list[ii]->last_y != NULL )
00965       free( Graph_xy_list[ii]->last_y ) ;
00966 
00967    if( mp->userdata != NULL ) free(mp->userdata) ;
00968 
00969    free( Graph_xy_list[ii] ) ; Graph_xy_list[ii] = NULL ; return ;
00970 }
00971 
00972 
00973 
00974 
00975 
00976 static int AFNI_drive_geom_graph( char *cmd )
00977 {
00978    int ntok , ig ;
00979    char **stok=NULL ;
00980    char *gname , *cpt ;
00981    Graph_xy *gxy ;
00982    int gww=-1,ghh=-1,gxx=-1,gyy=-1 ;
00983 
00984 ENTRY("AFNI_drive_geom_graph") ;
00985 
00986    
00987 
00988    ntok = breakup_string( cmd , &stok ) ;
00989    if( ntok <= 0 || stok == NULL ) RETURN(-1) ;
00990 
00991    
00992 
00993    ig = find_graph_xy_name( stok[0] ) ;
00994    freeup_strings(ntok,stok) ;
00995    if( ig < 0 || Graph_xy_list[ig]->mp == NULL ) RETURN(-1) ;
00996    gxy = Graph_xy_list[ig] ;
00997 
00998    cpt = strstr(cmd,"geom=") ;
00999    if( cpt == NULL ) cpt = strstr(cmd,"geom:") ;
01000    if( cpt == NULL || strlen(cpt) < 7 ) RETURN(-1) ;
01001 
01002    AFNI_decode_geom( cpt+5 , &gww,&ghh,&gxx,&gyy ) ;
01003 
01004    ig = -1 ;
01005    if( gxx >= 0 && gyy >= 0 ){
01006      XtVaSetValues( gxy->mp->top , XmNx,gxx    , XmNy,gyy     , NULL ); ig=0;
01007    }
01008    if( gww > 0 && ghh > 0 ){
01009      XtVaSetValues( gxy->mp->top , XmNwidth,gww, XmNheight,ghh, NULL ); ig=0;
01010    }
01011 
01012    RETURN(ig) ;
01013 }
01014 
01015 
01016 
01017 
01018 
01019 
01020 static int AFNI_drive_open_graph_xy( char *cmd )
01021 {
01022    int ntok , ig ;
01023    char **stok=NULL ;
01024 
01025    char *gname , *toplabel=NULL , *xlabel=NULL , *ylabel=NULL ;
01026    int   ny=1 ;
01027    float xbot=0.0,xtop=1.0 , ybot=0.0,ytop=1.0 ;
01028    char **yname=NULL ;
01029 
01030    Graph_xy *gxy ;
01031 
01032 ENTRY("AFNI_drive_open_graph_xy") ;
01033 
01034    
01035 
01036    ntok = breakup_string( cmd , &stok ) ;
01037    if( ntok <= 0 || stok == NULL ) RETURN(-1) ;
01038 
01039    
01040 
01041    gname = stok[0] ;
01042    ig = find_graph_xy_name( gname ) ;
01043    if( ig >= 0 ){
01044       freeup_strings(ntok,stok) ; RETURN(-1) ;   
01045    }
01046 
01047    
01048 
01049    ig = find_empty_graph_xy() ;
01050 
01051    Graph_xy_list[ig] = gxy = (Graph_xy *) calloc(1,sizeof(Graph_xy)) ;
01052 
01053    MCW_strncpy( gxy->gname , gname , THD_MAX_NAME ) ;
01054 
01055 #if 0
01056 { int qq ;
01057   fprintf(stderr,"AFNI_drive_open_graph_xy tokens:\n") ;
01058   for( qq=0 ; qq < ntok ; qq++ ) fprintf(stderr," %2d:%s\n",qq,stok[qq]); }
01059 #endif
01060 
01061    
01062 
01063    if( ntok > 1 ) toplabel = stok[1] ;
01064 
01065    if( ntok > 2 ) xbot = strtod(stok[2],NULL) ;
01066    if( ntok > 3 ) xtop = strtod(stok[3],NULL) ;
01067    if( xbot == xtop )    { xtop = xbot+1.0 ; }
01068    else if( xbot > xtop ){ float qq = xbot; xbot = xtop; xtop = qq ; }
01069 
01070    if( ntok > 4 ) xlabel = stok[4] ;
01071 
01072    if( ntok > 5 ){
01073       int qq = strtol(stok[5],NULL,10) ;
01074       if( qq > 1 ) ny = qq ;
01075    }
01076 
01077    if( ntok > 6 ) ybot = strtod(stok[6],NULL) ;
01078    if( ntok > 7 ) ytop = strtod(stok[7],NULL) ;
01079    if( ybot == ytop )    { ytop = ybot+1.0 ; }
01080    else if( ybot > ytop ){ float qq = ybot; ybot = ytop; ytop = qq ; }
01081 
01082    if( ntok > 8 ) ylabel = stok[8] ;
01083 
01084    if( ntok > 9 ){
01085       int qq ;
01086       yname = (char **) calloc( ny , sizeof(char *) ) ;
01087       for( qq=0 ; qq < ny && qq+9 < ntok ; qq++ ) yname[qq] = stok[qq+9] ;
01088    }
01089 
01090    
01091 
01092    gxy->xbot = xbot ; gxy->xtop = xtop ;
01093    gxy->ybot = ybot ; gxy->ytop = ytop ; gxy->ny = ny ;
01094 
01095    gxy->num_pt = 0 ;  
01096 
01097    
01098 
01099    gxy->mp = plot_ts_init( GLOBAL_library.dc->display ,
01100                            xbot , xtop ,
01101                            -ny , ybot , ytop ,
01102                            xlabel , ylabel ,
01103                            toplabel , yname , kill_graph_xy ) ;
01104 
01105    freeup_strings(ntok,stok) ;
01106    if( yname != NULL ) free(yname) ;
01107 
01108    if( gxy->mp == NULL ){         
01109       free(Graph_xy_list[ig]) ; Graph_xy_list[ig] = NULL ;
01110       RETURN(-1) ;
01111    }
01112 
01113    
01114 
01115    gxy->num_mpinit = MEMPLOT_NLINE(gxy->mp->mp) ;
01116 
01117    
01118 
01119    gxy->last_y = (float *) calloc(ny,sizeof(float)) ;
01120 
01121    RETURN(0) ;
01122 }
01123 
01124 
01125 
01126 
01127 
01128 static int AFNI_drive_close_graph_xy( char *cmd )
01129 {
01130    int ig , ntok ;
01131    char **stok = NULL ;
01132 
01133 ENTRY("AFNI_drive_close_graph_xy") ;
01134 
01135    
01136 
01137    ntok = breakup_string( cmd , &stok ) ;
01138    if( ntok <= 0 || stok == NULL ) RETURN(-1) ;
01139 
01140    
01141 
01142    ig = find_graph_xy_name( stok[0] ) ;
01143    freeup_strings(ntok,stok) ;
01144    if( ig < 0 || Graph_xy_list[ig]->mp == NULL ) RETURN(-1) ;
01145 
01146    plotkill_topshell( Graph_xy_list[ig]->mp ) ; 
01147    RETURN(0) ;
01148 }
01149 
01150 
01151 
01152 
01153 
01154 static int AFNI_drive_clear_graph_xy( char *cmd )
01155 {
01156    int ig , ntok ;
01157    char **stok = NULL ;
01158 
01159 ENTRY("AFNI_drive_clear_graph_xy") ;
01160 
01161    
01162 
01163    ntok = breakup_string( cmd , &stok ) ;
01164    if( ntok <= 0 || stok == NULL ) RETURN(-1) ;
01165 
01166    
01167 
01168    ig = find_graph_xy_name( stok[0] ) ;
01169    freeup_strings(ntok,stok) ;
01170    if( ig < 0 || Graph_xy_list[ig]->mp == NULL ) RETURN(-1) ;
01171 
01172    
01173 
01174    TRUNC_MEMPLOT( Graph_xy_list[ig]->mp->mp ,
01175                   Graph_xy_list[ig]->num_mpinit ) ;
01176 
01177    
01178 
01179    redraw_topshell( Graph_xy_list[ig]->mp ) ;
01180    Graph_xy_list[ig]->num_pt = 0 ;  
01181    RETURN(0) ;
01182 }
01183 
01184 
01185 
01186 
01187 
01188 static int AFNI_drive_addto_graph_xy( char *cmd )
01189 {
01190    int ig , ntok , nx , ny , ii,jj , tt , num_pt , ibot ;
01191    char **stok = NULL ;
01192    Graph_xy *gxy ;
01193    float *x , **y ;
01194 
01195 ENTRY("AFNI_drive_addto_graph_xy") ;
01196 
01197    
01198 
01199    ntok = breakup_string( cmd , &stok ) ;
01200    if( ntok <= 0 || stok == NULL ) RETURN(-1) ;
01201 
01202    
01203 
01204    ig = find_graph_xy_name( stok[0] ) ;
01205    if( ig < 0 || Graph_xy_list[ig]->mp == NULL ){
01206       freeup_strings(ntok,stok) ; RETURN(-1) ;
01207    }
01208    gxy = Graph_xy_list[ig] ;
01209 
01210    
01211 
01212    ny = gxy->ny ;
01213 
01214    
01215 
01216    nx = (ntok-1)/(ny+1) ;
01217    if( nx < 1 ){ freeup_strings(ntok,stok); RETURN(-1); }
01218 
01219    
01220 
01221    num_pt = gxy->num_pt ;
01222    if( num_pt > 0 ) nx++ ;  
01223 
01224    x = (float *) calloc(nx,sizeof(float)) ;
01225    y = (float **) malloc( sizeof(float *)*ny ) ;
01226    for( jj=0 ; jj < ny ; jj++ )
01227       y[jj] = (float *) calloc(nx,sizeof(float)) ;
01228 
01229    
01230 
01231    if( num_pt > 0 ){
01232       x[0] = gxy->last_x ;
01233       for( jj=0 ; jj < ny ; jj++ ) y[jj][0] = gxy->last_y[jj] ;
01234       ibot = 1 ;
01235    } else {
01236       ibot = 0 ;
01237    }
01238 
01239    
01240 
01241    tt = 1 ;                            
01242    for( ii=ibot ; ii < nx ; ii++ ){
01243       x[ii] = strtod( stok[tt++] , NULL ) ;
01244       for( jj=0 ; jj < ny ; jj++ )
01245          y[jj][ii] = strtod( stok[tt++] , NULL ) ;
01246    }
01247 
01248    
01249 
01250    gxy->last_x = x[nx-1] ;
01251    for( jj=0 ; jj < ny ; jj++ ) gxy->last_y[jj] = y[jj][nx-1] ;
01252 
01253    
01254 
01255    plot_ts_addto( gxy->mp , nx , x , -ny , y ) ;
01256 
01257    
01258 
01259    gxy->num_pt += nx ;  
01260 
01261    for( jj=0 ; jj < ny ; jj++ ) free(y[jj]) ;
01262    free(y) ; free(x) ; freeup_strings(ntok,stok) ;
01263 
01264    RETURN(0) ;
01265 }
01266 
01267 
01268 
01269 
01270 
01271 static int AFNI_drive_close_graph_1D( char *cmd )
01272 {
01273   return AFNI_drive_close_graph_xy( cmd ) ;
01274 }
01275 
01276 
01277 
01278 
01279 
01280 
01281 static int AFNI_drive_open_graph_1D( char *cmd )
01282 {
01283    int ntok , ig , ii ;
01284    char **stok=NULL ;
01285 
01286    char *gname , *toplabel=NULL , *xlabel=NULL , *ylabel=NULL ;
01287    int   ny=1 , nx=500 ;
01288    float dx=1.0 , ybot=0.0,ytop=1.0 ;
01289    char **yname=NULL ;
01290 
01291    Graph_xy *gxy ;
01292 
01293 ENTRY("AFNI_drive_open_graph_1D") ;
01294 
01295    
01296 
01297    ntok = breakup_string( cmd , &stok ) ;
01298    if( ntok <= 0 || stok == NULL ) RETURN(-1) ;
01299 
01300    
01301 
01302    gname = stok[0] ;
01303    ig = find_graph_xy_name( gname ) ;
01304    if( ig >= 0 ){
01305       freeup_strings(ntok,stok) ; RETURN(-1) ;   
01306    }
01307 
01308 #if 0
01309 { int qq ;
01310   fprintf(stderr,"AFNI_drive_open_graph_1D tokens:\n") ;
01311   for( qq=0 ; qq < ntok ; qq++ ) fprintf(stderr," %2d:%s\n",qq,stok[qq]); }
01312 #endif
01313 
01314    
01315 
01316    ig = find_empty_graph_xy() ;
01317 
01318    Graph_xy_list[ig] = gxy = (Graph_xy *) malloc(sizeof(Graph_xy)) ;
01319 
01320    MCW_strncpy( gxy->gname , gname , THD_MAX_NAME ) ;
01321 
01322    
01323 
01324    if( ntok > 1 ) toplabel = stok[1] ;
01325 
01326    if( ntok > 2 ){
01327       int qq = strtol(stok[2],NULL,10) ;
01328       if( qq >= 10 ) nx = qq ;
01329    }
01330 
01331    if( ntok > 3 ){
01332       float qq = strtod(stok[3],NULL) ;
01333       if( qq > 0.0 ) dx = qq ;
01334    }
01335 
01336    if( ntok > 4 ) xlabel = stok[4] ;
01337 
01338    if( ntok > 5 ){
01339       int qq = strtol(stok[5],NULL,10) ;
01340       if( qq > 1 ) ny = qq ;
01341    }
01342 
01343    if( ntok > 6 ) ybot = strtod(stok[6],NULL) ;
01344    if( ntok > 7 ) ytop = strtod(stok[7],NULL) ;
01345    if( ybot == ytop )    { ytop = ybot+1.0 ; }
01346    else if( ybot > ytop ){ float qq = ybot; ybot = ytop; ytop = qq ; }
01347 
01348    if( ntok > 8 ) ylabel = stok[8] ;
01349 
01350    if( ntok > 9 ){
01351       int qq ;
01352       yname = (char **) calloc( ny , sizeof(char *) ) ;
01353       for( qq=0 ; qq < ny && qq+9 < ntok ; qq++ ) yname[qq] = stok[qq+9] ;
01354    }
01355 
01356    
01357 
01358    gxy->xbot = 0.0  ; gxy->xtop = nx*dx ;
01359    gxy->ybot = ybot ; gxy->ytop = ytop  ; gxy->ny = ny ;
01360 
01361    gxy->num_pt = 0.0 ;
01362 
01363    
01364 
01365    gxy->mp = plot_strip_init( GLOBAL_library.dc->display ,
01366                               nx , dx ,
01367                               -ny , ybot , ytop ,
01368                               xlabel , ylabel ,
01369                               toplabel , yname , kill_graph_xy ) ;
01370 
01371    freeup_strings(ntok,stok) ;
01372    if( yname != NULL ) free(yname) ;
01373 
01374    if( gxy->mp == NULL ){         
01375       free(Graph_xy_list[ig]) ; Graph_xy_list[ig] = NULL ;
01376       RETURN(-1) ;
01377    }
01378 
01379    gxy->last_y = NULL ;  
01380 
01381    RETURN(0) ;
01382 }
01383 
01384 
01385 
01386 
01387 
01388 static int AFNI_drive_clear_graph_1D( char *cmd )
01389 {
01390    int ig , ntok , ii ;
01391    char **stok = NULL ;
01392 
01393 ENTRY("AFNI_drive_clear_graph_1D") ;
01394 
01395    
01396 
01397    ntok = breakup_string( cmd , &stok ) ;
01398    if( ntok <= 0 || stok == NULL ) RETURN(-1) ;
01399 
01400    
01401 
01402    ig = find_graph_xy_name( stok[0] ) ;
01403    freeup_strings(ntok,stok) ;
01404    if( ig < 0 || Graph_xy_list[ig]->mp == NULL ) RETURN(-1) ;
01405 
01406    
01407 
01408    plot_strip_clear( Graph_xy_list[ig]->mp ) ;  
01409 
01410    RETURN(0) ;
01411 }
01412 
01413 
01414 
01415 
01416 
01417 static int AFNI_drive_addto_graph_1D( char *cmd )
01418 {
01419    int ig, ntok, nx, ny, ii,jj, tt, num_pt, ibot, nadd ;
01420    char **stok = NULL ;
01421    Graph_xy *gxy ;
01422    float **y ;
01423 
01424 ENTRY("AFNI_drive_addto_graph_1D") ;
01425 
01426    
01427 
01428    ntok = breakup_string( cmd , &stok ) ;
01429    if( ntok <= 0 || stok == NULL ) RETURN(-1) ;
01430 
01431    
01432 
01433    ig = find_graph_xy_name( stok[0] ) ;
01434    if( ig < 0 || Graph_xy_list[ig]->mp == NULL ){
01435       freeup_strings(ntok,stok) ; RETURN(-1) ;
01436    }
01437    gxy = Graph_xy_list[ig] ;
01438 
01439    
01440 
01441    ny = gxy->ny ;
01442 
01443    
01444 
01445    nadd = (ntok-1)/ny ;
01446    if( nadd < 1 ){ freeup_strings(ntok,stok); RETURN(-1); }
01447 
01448    
01449 
01450    y = (float **) malloc( sizeof(float *)*ny ) ;
01451    for( jj=0 ; jj < ny ; jj++ )
01452       y[jj] = (float *) calloc(nadd,sizeof(float)) ;
01453 
01454    
01455 
01456    tt = 1 ;                            
01457    for( ii=0 ; ii < nadd ; ii++ ){
01458       for( jj=0 ; jj < ny ; jj++ )
01459          y[jj][ii] = strtod( stok[tt++] , NULL ) ;
01460    }
01461 
01462    
01463 
01464    plot_strip_addto( gxy->mp , nadd , y ) ;
01465 
01466    
01467 
01468    for( jj=0 ; jj < ny ; jj++ ) free(y[jj]) ;
01469    free(y) ; freeup_strings(ntok,stok) ;
01470 
01471    RETURN(0) ;
01472 }
01473 
01474 
01475 
01476 
01477 
01478 static int AFNI_drive_add_overlay_color( char *cmd )
01479 {
01480    char cdef[256]="\0" , clab[256]="\0" ;
01481    int ii ;
01482 
01483 ENTRY("AFNI_drive_add_overlay_color") ;
01484 
01485    sscanf( cmd , "%255s %255s" , cdef,clab ) ;
01486    if( cdef[0] == '\0' || clab[0] == '\0' ) RETURN(-1) ;
01487 
01488    if( GLOBAL_library.dc == NULL ){           
01489      if( INIT_ncolovr < MAX_NCOLOVR ){
01490        ii = INIT_ncolovr++ ;
01491        INIT_labovr[ii] = XtNewString(cdef) ;
01492        INIT_colovr[ii] = XtNewString(clab) ;
01493      } else
01494        RETURN(-1) ;
01495    } else {                                   
01496      ii = DC_add_overlay_color( GLOBAL_library.dc , cdef , clab ) ;
01497      if( ii < 0 ) RETURN(-1) ;
01498      OVC_mostest( GLOBAL_library.dc->ovc ) ;
01499    }
01500    RETURN(0) ;
01501 }
01502 
01503 
01504 
01505 
01506 
01507 
01508 
01509 static int AFNI_drive_set_threshold( char *cmd )
01510 {
01511    int ic , dadd=1 , dec=-1 , ival , smax ;
01512    Three_D_View *im3d ;
01513    float val ;
01514    char *cpt ;
01515    static float tval[9] = { 1.0 , 10.0 , 100.0 , 1000.0 , 10000.0 ,
01516                             100000.0 , 1000000.0 , 10000000.0 , 100000000.0 } ;
01517 
01518 ENTRY("AFNI_drive_set_threshold") ;
01519 
01520    if( cmd == NULL || strlen(cmd) < 3 ) RETURN(-1) ;
01521 
01522    ic = AFNI_controller_code_to_index( cmd ) ;
01523    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
01524 
01525    im3d = GLOBAL_library.controllers[ic] ;
01526    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;
01527 
01528    
01529 
01530    if( cmd[dadd] != '.' ) RETURN(-1) ;
01531    val = strtod( cmd+dadd , &cpt ) ;
01532    ival = rint(val/THR_FACTOR) ;
01533    smax = (int)( pow(10.0,THR_TOP_EXPON) + 0.001 ) - 1 ;
01534    if( ival < 0 || ival > smax ) RETURN(-1) ;
01535    XmScaleSetValue( im3d->vwid->func->thr_scale , ival ) ;
01536 
01537    
01538 
01539    sscanf(cpt,"%d",&dec) ;
01540 
01541    if( dec >= 0 && dec <= THR_TOP_EXPON )
01542      AFNI_set_thresh_top( im3d , tval[dec] ) ;
01543 
01544    AFNI_thr_scale_CB( im3d->vwid->func->thr_scale, (XtPointer)im3d, NULL ) ;
01545    RETURN(0) ;
01546 }
01547 
01548 
01549 
01550 
01551 
01552 
01553 
01554 static int AFNI_drive_set_threshnew( char *cmd )
01555 {
01556    int ic,dadd , olddec,newdec , ival,smax,id,stop , dopval,dostar;
01557    Three_D_View *im3d ;
01558    float val , pval ;
01559    char *cpt ;
01560    static float tval[9] = { 1.0 , 10.0 , 100.0 , 1000.0 , 10000.0 ,
01561                             100000.0 , 1000000.0 , 10000000.0 , 100000000.0 } ;
01562 
01563 ENTRY("AFNI_drive_set_threshnew") ;
01564 
01565    if( cmd == NULL || *cmd == '\0' ) RETURN(-1) ;
01566 
01567    ic = AFNI_controller_code_to_index( cmd ) ;
01568    if( ic < 0 ){
01569      ic = 0 ; dadd = 0 ;
01570    } else {
01571      if( cmd[1] == '\0' ) RETURN(-1) ;   
01572      dadd = 2 ;                          
01573    }
01574 
01575    im3d = GLOBAL_library.controllers[ic] ;
01576    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;   
01577 
01578    
01579 
01580    val = strtod( cmd+dadd , &cpt ) ;
01581    if( val < 0.0 || val > THR_TOP_VALUE ) RETURN(-1) ; 
01582 
01583    
01584 
01585    olddec = (int)rint( log10(im3d->vinfo->func_thresh_top) ) ;
01586         if( olddec < 0             ) olddec = 0 ;
01587    else if( olddec > THR_TOP_EXPON ) olddec = THR_TOP_EXPON ;
01588    newdec = olddec ;
01589 
01590    smax  = (int)rint( pow(10.0,THR_TOP_EXPON) ) ;
01591    stop  = smax - 1 ;                             
01592 
01593    dopval = (val >= 0.0) && (val <= 1.0) && (strchr(cpt,'p') != NULL) &&
01594             (DSET_BRICK_STATCODE(im3d->fim_now,im3d->vinfo->thr_index) > 0) ;
01595 
01596    dostar = (val > 0.0) && (strchr(cpt,'*') != NULL) ;
01597 
01598    if( dopval ){
01599      pval = THD_pval_to_stat( val ,
01600               DSET_BRICK_STATCODE(im3d->fim_now,im3d->vinfo->thr_index) ,
01601               DSET_BRICK_STATAUX (im3d->fim_now,im3d->vinfo->thr_index)  ) ;
01602      if( pval >= 0.0 ) val = pval ;
01603    }
01604 
01605    if( val >= im3d->vinfo->func_thresh_top || dostar ){ 
01606 
01607      newdec = (int)( log10(val) + 1.0 ) ;
01608           if( newdec < 0             ) newdec = 0 ;
01609      else if( newdec > THR_TOP_EXPON ) newdec = THR_TOP_EXPON ;
01610    }
01611 
01612    if( newdec != olddec )
01613      AFNI_set_thresh_top( im3d , tval[newdec] ) ;
01614 
01615    ival = rint( val/(THR_FACTOR*tval[newdec]) ) ;
01616         if( ival < 0    ) ival = 0    ;
01617    else if( ival > stop ) ival = stop ;
01618 
01619    XmScaleSetValue( im3d->vwid->func->thr_scale , ival ) ;
01620 
01621    AFNI_thr_scale_CB( im3d->vwid->func->thr_scale, (XtPointer)im3d, NULL ) ;
01622    RETURN(0) ;
01623 }
01624 
01625 
01626 
01627 
01628 
01629 
01630 
01631 static int AFNI_drive_set_pbar_number( char *cmd )
01632 {
01633    int ic , dadd=2 , num=-1 ;
01634    Three_D_View *im3d ;
01635    MCW_pbar *pbar ;
01636 
01637 ENTRY("AFNI_drive_set_pbar_number") ;
01638 
01639    if( cmd == NULL || strlen(cmd) < 1 ) RETURN(-1) ;
01640 
01641    ic = AFNI_controller_code_to_index( cmd ) ;
01642    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
01643    if( !isdigit(cmd[dadd]) ) RETURN(-1) ;
01644 
01645    im3d = GLOBAL_library.controllers[ic] ;
01646    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;
01647 
01648    pbar = im3d->vwid->func->inten_pbar ;
01649 
01650    num = (int) strtod( cmd+dadd , NULL ) ;
01651    if( num < NPANE_MIN ) RETURN(-1) ;
01652    if( num > NPANE_MAX ) num = NPANE_MAX+1 ;
01653    AV_assign_ival( im3d->vwid->func->inten_av , num ) ;
01654 
01655    HIDE_SCALE(im3d) ;
01656    if( num <= NPANE_MAX ){
01657      pbar->bigmode = 0 ;
01658      alter_MCW_pbar( pbar , num , NULL ) ;
01659      NORMAL_cursorize( pbar->panew ) ;  
01660    } else {
01661      int npane=pbar->num_panes , jm=pbar->mode ;
01662      float pmax=pbar->pval_save[npane][0][jm] ,
01663            pmin=pbar->pval_save[npane][npane][jm] ;
01664      PBAR_set_bigmode( pbar , 1 , pmin,pmax ) ;
01665      AFNI_inten_pbar_CB( pbar , im3d , 0 ) ;
01666      POPUP_cursorize( pbar->panew ) ;  
01667    }
01668    FIX_SCALE_SIZE(im3d) ;
01669 
01670    RETURN(0) ;
01671 }
01672 
01673 
01674 
01675 
01676 
01677 
01678 static int AFNI_drive_set_pbar_sign( char *cmd )
01679 {
01680    int ic , dadd=2 , val ;
01681    Three_D_View *im3d ;
01682 
01683 ENTRY("AFNI_drive_set_pbar_sign") ;
01684 
01685    if( cmd == NULL || strlen(cmd) < 1 ) RETURN(-1) ;
01686 
01687    ic = AFNI_controller_code_to_index( cmd ) ;
01688    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
01689 
01690    im3d = GLOBAL_library.controllers[ic] ;
01691    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;
01692 
01693    switch( cmd[dadd] ){
01694      default: RETURN(-1) ;
01695 
01696      case 'p':
01697      case 'P':
01698      case '+': val = 1 ; break ;
01699 
01700      case 's':
01701      case 'S':
01702      case '-': val = 0 ; break ;
01703    }
01704 
01705    MCW_set_bbox( im3d->vwid->func->inten_bbox , val ) ;
01706 
01707    AFNI_inten_bbox_CB( im3d->vwid->func->inten_bbox->wbut[PBAR_MODEBUT] ,
01708                        (XtPointer)im3d , NULL ) ;
01709    RETURN(0) ;
01710 }
01711 
01712 
01713 
01714 
01715 
01716 
01717 
01718 static int AFNI_drive_set_pbar_all( char *cmd )
01719 {
01720    int ic , dadd=2 , npan=0 , pos , nn , ii,jj ;
01721    float pval[NPANE_MAX+1] , val ;
01722    int   pcol[NPANE_MAX]   , col , flip=0 , rota=0 ;
01723    char  str[256] , *cpt ;
01724    MCW_pbar *pbar ;
01725    Three_D_View *im3d ;
01726 
01727 ENTRY("AFNI_drive_set_pbar_all") ;
01728 
01729    if( cmd == NULL || strlen(cmd) < 4 ) RETURN(-1) ;
01730 
01731    ic = AFNI_controller_code_to_index( cmd ) ;
01732    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
01733 
01734    im3d = GLOBAL_library.controllers[ic] ;
01735    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;
01736 
01737    
01738 
01739    switch( cmd[dadd] ){
01740      default: RETURN(-1) ;
01741      case '+': pos = 1 ; break ;
01742      case '-': pos = 0 ; break ;
01743    }
01744    dadd++ ;
01745 
01746    
01747 
01748    sscanf( cmd+dadd , "%d%n" , &npan , &nn ) ;
01749    if( npan < NPANE_MIN ) RETURN(-1) ;
01750    if( npan > NPANE_MAX ) npan = NPANE_MAX+1 ;
01751    dadd += nn ;
01752 
01753    pbar = im3d->vwid->func->inten_pbar ;
01754 
01755    if( npan <= NPANE_MAX ){ 
01756 
01757      for( ii=0 ; ii < npan ; ii++ ){
01758        str[0] = '\0' ; nn = 0 ;
01759        sscanf( cmd+dadd , "%f=%255s%n" , &val,str,&nn ) ;
01760        if( str[0] == '\0' || nn == 0 ) RETURN(-1) ;  
01761 
01762        col = DC_find_overlay_color( GLOBAL_library.dc , str ) ;
01763        if( col < 0 )                   RETURN(-1) ;  
01764 
01765        for( jj=0 ; jj < ii ; jj++ )                  
01766          if( pval[jj] <= val )         RETURN(-1) ;
01767 
01768        if( ii > 0 ){                                 
01769          if( fabs(val) >= pval[0] )    RETURN(-1) ;
01770          if( pos && val <= 0.0 )       RETURN(-1) ;
01771        } else {
01772          if( val <= 0.0 )              RETURN(-1) ;
01773        }
01774 
01775        pval[ii] = val ; pcol[ii] = col ;
01776        dadd += nn ;
01777      }
01778      if( pos ) pval[npan] = 0.0 ;        
01779      else      pval[npan] = -pval[0] ;
01780 
01781    } else {     
01782 
01783      str[0] = '\0' ; val = 0.0 ;
01784      sscanf( cmd+dadd , "%f %s" , &val, str ) ;
01785      if( val <= 0.0 ) RETURN(-1) ;
01786 
01787      flip = ( strstr(cmd+dadd,"FLIP") != NULL ) ;
01788 
01789      cpt = strstr(cmd+dadd,"ROTA=") ;
01790      if( cpt == NULL ) cpt = strstr(cmd+dadd,"ROTA:") ;
01791      if( cpt != NULL ) sscanf(cpt+5,"%d",&rota) ;
01792    }
01793 
01794    
01795 
01796    im3d->vinfo->use_posfunc = pbar->mode = pos ;
01797    MCW_set_bbox( im3d->vwid->func->inten_bbox , pos ) ;
01798    AV_assign_ival( im3d->vwid->func->inten_av , npan ) ;
01799 
01800    HIDE_SCALE(im3d) ;
01801    if( npan <= NPANE_MAX ){         
01802      for( ii=0 ; ii < npan ; ii++ ){
01803        pbar->ov_index[ii] = pbar->ovin_save[npan][ii][pos] = pcol[ii] ;
01804        PBAR_set_panecolor( pbar , ii , pcol[ii] ) ;
01805      }
01806      pbar->bigmode = 0 ;
01807      alter_MCW_pbar( pbar , npan , pval ) ;
01808      AFNI_hintize_pbar( pbar , (im3d->vinfo->fim_range != 0.0)
01809                                 ? im3d->vinfo->fim_range
01810                                 : im3d->vinfo->fim_autorange ) ;
01811      NORMAL_cursorize( pbar->panew ) ;  
01812    } else {    
01813      float pmax, pmin ;
01814      pbar->bigset = 0 ;
01815      pmax = val ; pmin = (pbar->mode) ? 0.0 : -pmax ;
01816      PBAR_set_bigmode( pbar , 1 , pmin,pmax ) ;
01817      PBAR_set_bigmap( pbar , str ) ;
01818      rotate_MCW_pbar( pbar , rota ) ;  
01819      if( flip ) PBAR_flip( pbar ) ;    
01820      AFNI_inten_pbar_CB( pbar , im3d , 0 ) ;
01821      POPUP_cursorize( pbar->panew ) ;  
01822    }
01823    FIX_SCALE_SIZE(im3d) ;
01824 
01825    RETURN(0) ;
01826 }
01827 
01828 
01829 
01830 
01831 
01832 
01833 static int AFNI_drive_pbar_rotate( char *cmd )
01834 {
01835    int ic , dadd=2 , nn ;
01836    MCW_pbar *pbar ;
01837    Three_D_View *im3d ;
01838 
01839 ENTRY("AFNI_drive_pbar_rotate") ;
01840 
01841    if( cmd == NULL || strlen(cmd) < 1 ) RETURN(-1) ;
01842 
01843    ic = AFNI_controller_code_to_index( cmd ) ;
01844    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
01845 
01846    im3d = GLOBAL_library.controllers[ic] ;
01847    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;
01848 
01849    
01850 
01851    switch( cmd[dadd] ){
01852      default: RETURN(-1) ;
01853      case '+': nn =  1 ; break ;
01854      case '-': nn = -1 ; break ;
01855    }
01856 
01857    rotate_MCW_pbar( im3d->vwid->func->inten_pbar , nn ) ;
01858    RETURN(0) ;
01859 }
01860 
01861 
01862 
01863 
01864 
01865 
01866 static int AFNI_set_func_autorange( char *cmd )
01867 {
01868    int ic , dadd=2 , nn ;
01869    Three_D_View *im3d ;
01870 
01871 ENTRY("AFNI_set_func_autorange") ;
01872 
01873    if( cmd == NULL || strlen(cmd) < 1 ) RETURN(-1) ;
01874 
01875    ic = AFNI_controller_code_to_index( cmd ) ;
01876    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
01877 
01878    im3d = GLOBAL_library.controllers[ic] ;
01879    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;
01880 
01881    switch( cmd[dadd] ){
01882      default: RETURN(-1) ;
01883      case '+': nn = 1 ; break ;
01884      case '-': nn = 0 ; break ;
01885    }
01886 
01887    MCW_set_bbox( im3d->vwid->func->range_bbox , nn ) ;
01888    AFNI_range_bbox_CB( im3d->vwid->func->range_bbox->wbut[RANGE_AUTOBUT] ,
01889                        im3d , NULL ) ;
01890    RETURN(0) ;
01891 }
01892 
01893 
01894 
01895 
01896 
01897 
01898 static int AFNI_set_func_range( char *cmd )
01899 {
01900    int ic , dadd=2 ;
01901    Three_D_View *im3d ;
01902    float val ;
01903 
01904 ENTRY("AFNI_set_func_range") ;
01905 
01906    if( cmd == NULL || strlen(cmd) < 1 ) RETURN(-1) ;
01907 
01908    ic = AFNI_controller_code_to_index( cmd ) ;
01909    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
01910 
01911    im3d = GLOBAL_library.controllers[ic] ;
01912    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;
01913 
01914    val = strtod( cmd+dadd , NULL ) ;
01915    if( val <  0.0 ) RETURN(-1) ;
01916 
01917    if( val == 0.0 ){
01918      char clabel[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
01919      char str[8] ;
01920      sprintf(str,"%c.+",clabel[ic]) ;
01921      RETURN( AFNI_set_func_autorange(str) ) ;
01922    }
01923 
01924    MCW_set_bbox( im3d->vwid->func->range_bbox , 0 ) ;   
01925    im3d->vinfo->use_autorange = 0 ;
01926 
01927    AV_SENSITIZE( im3d->vwid->func->range_av , 1 ) ;
01928    AV_assign_fval( im3d->vwid->func->range_av , val ) ;
01929    AFNI_range_av_CB( im3d->vwid->func->range_av , im3d ) ;
01930    RETURN(0) ;
01931 }
01932 
01933 
01934 
01935 
01936 
01937 
01938 static int AFNI_set_func_visible( char *cmd )
01939 {
01940    int ic , dadd=2 , nn ;
01941    Three_D_View *im3d ;
01942 
01943 ENTRY("AFNI_set_func_visible") ;
01944 
01945    if( cmd == NULL || strlen(cmd) < 1 ) RETURN(-1) ;
01946 
01947    ic = AFNI_controller_code_to_index( cmd ) ;
01948    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
01949 
01950    im3d = GLOBAL_library.controllers[ic] ;
01951    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;
01952 
01953    switch( cmd[dadd] ){
01954      default: RETURN(-1) ;
01955      case '+': nn = 1 ; break ;
01956      case '-': nn = 0 ; break ;
01957    }
01958 
01959    MCW_set_bbox( im3d->vwid->view->see_func_bbox , nn ) ;
01960    AFNI_see_func_CB( NULL , im3d , NULL ) ;
01961    RETURN(0) ;
01962 }
01963 
01964 
01965 
01966 
01967 
01968 
01969 static int AFNI_set_func_resam( char *cmd )
01970 {
01971    int ic , dadd=2 , fr=-1 , tr=-1 ;
01972    Three_D_View *im3d ;
01973 
01974 ENTRY("AFNI_set_func_resam") ;
01975 
01976    if( cmd == NULL || strlen(cmd) < 2 ) RETURN(-1) ;
01977 
01978    ic = AFNI_controller_code_to_index( cmd ) ;
01979    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
01980 
01981    im3d = GLOBAL_library.controllers[ic] ;
01982    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;
01983 
01984         if( cmd[dadd] == 'N' && cmd[dadd+1] == 'N' ) fr = 0 ;
01985    else if( cmd[dadd] == 'L' && cmd[dadd+1] == 'i' ) fr = 1 ;
01986    else if( cmd[dadd] == 'C' && cmd[dadd+1] == 'u' ) fr = 2 ;
01987    else if( cmd[dadd] == 'B' && cmd[dadd+1] == 'k' ) fr = 2 ;
01988    else                                              RETURN(-1);
01989 
01990    if( cmd[dadd+2] == '.' ){
01991      dadd += 3 ;
01992           if( cmd[dadd] == 'N' && cmd[dadd+1] == 'N' ) tr = 0 ;
01993      else if( cmd[dadd] == 'L' && cmd[dadd+1] == 'i' ) tr = 1 ;
01994      else if( cmd[dadd] == 'C' && cmd[dadd+1] == 'u' ) tr = 2 ;
01995      else if( cmd[dadd] == 'B' && cmd[dadd+1] == 'k' ) tr = 2 ;
01996      else                                              RETURN(-1);
01997    }
01998 
01999    AV_assign_ival( im3d->vwid->dmode->func_resam_av , fr ) ;
02000    im3d->vinfo->func_resam_mode = fr ;
02001    if( im3d->b123_fim != NULL )
02002      im3d->b123_fim->resam_code =
02003       im3d->b231_fim->resam_code =
02004        im3d->b312_fim->resam_code = im3d->vinfo->func_resam_mode ;
02005 
02006    if( tr >= 0 ){
02007      AV_assign_ival( im3d->vwid->dmode->thr_resam_av , fr ) ;
02008      im3d->vinfo->thr_resam_mode = tr ;
02009      if( im3d->b123_fim != NULL )
02010        im3d->b123_fim->thr_resam_code =
02011         im3d->b231_fim->thr_resam_code =
02012          im3d->b312_fim->thr_resam_code = im3d->vinfo->thr_resam_mode ;
02013    }
02014 
02015    AFNI_resam_av_CB( NULL , im3d ) ;
02016    RETURN(0) ;
02017 }
02018 
02019 
02020 
02021 
02022 static int AFNI_sleeper( char *cmd )
02023 {
02024    int ms=-1 ;
02025    if( cmd == NULL || strlen(cmd) < 1 ) return(-1) ;
02026    sscanf( cmd , "%d" , &ms ) ;
02027    if( ms > 0 ) RWC_sleep( ms ) ;
02028    return(0) ;
02029 }
02030 
02031 #if 0   
02032 
02033 
02034 
02035 int AFNI_setenv( char *cmd )
02036 {
02037    char nam[256]="\0" , val[1024]="\0" , eqn[1280] , *eee ;
02038 
02039    if( cmd == NULL || strlen(cmd) < 3 ) return(-1) ;
02040 
02041    sscanf( cmd , "%255s %1023s" , nam , val ) ;
02042    if( nam[0] == '\0' || val[0] == '\0' && strchr(cmd,'=') != NULL ){
02043      char *ccc = strdup(cmd) ;
02044      eee = strchr(ccc,'=') ; *eee = ' ' ;
02045      sscanf( ccc , "%255s %1023s" , nam , val ) ;
02046      free((void *)ccc) ;
02047    }
02048    if( nam[0] == '\0' || val[0] == '\0' ) return(-1) ;
02049 
02050    sprintf(eqn,"%s=%s",nam,val) ;
02051    eee = strdup(eqn) ; putenv(eee) ;
02052    return(0) ;
02053 }
02054 #endif
02055 
02056 
02057 
02058 
02059 static int AFNI_redisplay( char *cmd )
02060 {
02061    int cc ;
02062    Three_D_View *qq3d ;
02063 
02064    for( cc=0 ; cc < MAX_CONTROLLERS ; cc++ ){
02065       qq3d = GLOBAL_library.controllers[cc] ;
02066       if( ! IM3D_OPEN(qq3d) ) continue ;
02067       AFNI_set_viewpoint( qq3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
02068    }
02069    return(0) ;
02070 }
02071 
02072 
02073 
02074 
02075 static int AFNI_define_colorscale( char *cmd )
02076 {
02077   return PBAR_define_bigmap( cmd ) ;
02078 }
02079 
02080 
02081 
02082 
02083 static int AFNI_open_panel( char *cmd )
02084 {
02085    int ic , dadd=2 , fr=-1 , tr=-1 ;
02086    Three_D_View *im3d ;
02087 
02088 ENTRY("AFNI_open_panel") ;
02089 
02090    if( cmd == NULL || strlen(cmd) < 2 ) RETURN(-1) ;
02091 
02092    ic = AFNI_controller_code_to_index( cmd ) ;
02093    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
02094 
02095    im3d = GLOBAL_library.controllers[ic] ;
02096    if( !IM3D_OPEN(im3d) ) RETURN(-1) ;
02097 
02098    
02099 
02100    if( strcmp(cmd+dadd,"Define_Function") == 0 || strcmp(cmd+dadd,"Define_Overlay") == 0 ){
02101      if( !XtIsManaged(im3d->vwid->func->frame) )
02102        AFNI_define_CB( im3d->vwid->view->define_func_pb, im3d, NULL ) ;
02103    } else if( strcmp(cmd+dadd,"Define_Datamode") == 0 ){
02104      if( !XtIsManaged(im3d->vwid->dmode->frame) )
02105        AFNI_define_CB( im3d->vwid->view->define_dmode_pb, im3d, NULL ) ;
02106    } else if( strcmp(cmd+dadd,"Define_Markers")  == 0 ){
02107      if( !XtIsManaged(im3d->vwid->marks->frame) )
02108        AFNI_define_CB( im3d->vwid->view->define_marks_pb, im3d, NULL ) ;
02109    } else {
02110      RETURN(-1) ;
02111    }
02112    RETURN(0) ;
02113 }
02114 
02115 
02116 
02117 
02118 static int AFNI_drive_save_jpeg( char *cmd )
02119 {
02120    int ic , dadd=2 ;
02121    Three_D_View *im3d ;
02122    char junk[256] , fname[288] ;
02123    MCW_imseq   *isq=NULL ;
02124    MCW_grapher *gra=NULL ;
02125 
02126 ENTRY("AFNI_drive_save_jpeg") ;
02127 
02128    
02129 
02130    if( strlen(cmd) < 3 ) RETURN(-1) ;
02131 
02132    ic = AFNI_controller_code_to_index( cmd ) ;
02133    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
02134 
02135    im3d = GLOBAL_library.controllers[ic] ;
02136    if( !IM3D_OPEN(im3d) ){
02137      ERROR_message("SAVE_JPEG %s: controller not open",cmd); RETURN(-1);
02138    }
02139 
02140    
02141 
02142    junk[0] = fname[0] = '\0' ;
02143    sscanf( cmd+dadd , "%255s%255s" , junk , fname ) ;
02144    if( junk[0] == '\0' || fname[0] == '\0' ){
02145      ERROR_message("SAVE_JPEG %s: something is missing",cmd); RETURN(-1);
02146      RETURN(-1) ;
02147    }
02148 
02149    if( !STRING_HAS_SUFFIX(fname,".jpg") && !STRING_HAS_SUFFIX(fname,".JPG") )
02150      strcat(fname,".jpg") ;
02151 
02152    
02153 
02154         if( strstr(cmd+dadd,"axialimage")    != NULL ) isq = im3d->s123 ;
02155    else if( strstr(cmd+dadd,"sagittalimage") != NULL ) isq = im3d->s231 ;
02156    else if( strstr(cmd+dadd,"coronalimage")  != NULL ) isq = im3d->s312 ;
02157    else if( strstr(cmd+dadd,"axialgraph")    != NULL ) gra = im3d->g123 ;
02158    else if( strstr(cmd+dadd,"sagittalgraph") != NULL ) gra = im3d->g231 ;
02159    else if( strstr(cmd+dadd,"coronalgraph")  != NULL ) gra = im3d->g312 ;
02160 
02161    XmUpdateDisplay( im3d->vwid->top_shell ) ;
02162 
02163    if( isq != NULL ){
02164      drive_MCW_imseq( isq, isqDR_save_jpeg , (XtPointer)fname ) ;
02165    } else if( gra != NULL ){
02166      GRA_file_pixmap( gra , fname ) ;
02167    } else {
02168      ERROR_message("SAVE_JPEG %s: don't understand windowname",cmd) ;
02169      RETURN(-1) ;
02170    }
02171 
02172    RETURN(0) ;
02173 }
02174 
02175 
02176 
02177 
02178 static int AFNI_drive_set_view( char *cmd )
02179 {
02180    int ic , vv=-1 ;
02181    Three_D_View *im3d ;
02182 
02183    if( strlen(cmd) < 3 ) return -1;
02184 
02185    ic = AFNI_controller_code_to_index( cmd ) ;
02186    if( ic < 0 ) ic = 0 ;
02187    im3d = GLOBAL_library.controllers[ic] ;
02188    if( !IM3D_OPEN(im3d) ) return -1 ;
02189 
02190         if( strstr(cmd,"orig") != NULL ) vv = VIEW_ORIGINAL_TYPE ;
02191    else if( strstr(cmd,"acpc") != NULL ) vv = VIEW_ACPCALIGNED_TYPE ;
02192    else if( strstr(cmd,"tlrc") != NULL ) vv = VIEW_TALAIRACH_TYPE ;
02193    else                                  return -1 ;
02194 
02195    if( vv == im3d->vinfo->view_type ) return 0 ;  
02196    if( !XtIsSensitive(im3d->vwid->view->view_bbox->wbut[vv]) ) return -1 ;
02197 
02198    MCW_set_bbox( im3d->vwid->view->view_bbox , 1 << vv ) ;
02199    AFNI_switchview_CB( NULL , (XtPointer)im3d , NULL ) ;
02200    return 0 ;
02201 }
02202 
02203 
02204 
02205 
02206 static int AFNI_drive_set_dicom_xyz( char *cmd )
02207 {
02208    int ic , dadd=2 ;
02209    Three_D_View *im3d ;
02210    float x,y,z ;
02211 
02212    if( strlen(cmd) < 3 ) return -1;
02213 
02214    ic = AFNI_controller_code_to_index( cmd ) ;
02215    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
02216    im3d = GLOBAL_library.controllers[ic] ;
02217    if( !IM3D_OPEN(im3d) ) return -1 ;
02218 
02219    ic = sscanf( cmd+dadd , "%f%f%f" , &x,&y,&z ) ;
02220    if( ic < 3 ) return -1 ;
02221    AFNI_jumpto_dicom( im3d , x,y,z ) ;
02222    return 0 ;
02223 }
02224 
02225 
02226 
02227 
02228 static int AFNI_drive_set_spm_xyz( char *cmd )
02229 {
02230    int ic , dadd=2 ;
02231    Three_D_View *im3d ;
02232    float x,y,z ;
02233 
02234    if( strlen(cmd) < 3 ) return -1;
02235 
02236    ic = AFNI_controller_code_to_index( cmd ) ;
02237    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
02238    im3d = GLOBAL_library.controllers[ic] ;
02239    if( !IM3D_OPEN(im3d) ) return -1 ;
02240 
02241    ic = sscanf( cmd+dadd , "%f%f%f" , &x,&y,&z ) ;
02242    if( ic < 3 ) return -1 ;
02243    AFNI_jumpto_dicom( im3d , -x,-y,z ) ;
02244    return 0 ;
02245 }
02246 
02247 
02248 
02249 
02250 static int AFNI_drive_set_ijk( char *cmd )
02251 {
02252    int ic , dadd=2 ;
02253    Three_D_View *im3d ;
02254    int i,j,k ;
02255 
02256    if( strlen(cmd) < 3 ) return -1;
02257 
02258    ic = AFNI_controller_code_to_index( cmd ) ;
02259    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
02260    im3d = GLOBAL_library.controllers[ic] ;
02261    if( !IM3D_OPEN(im3d) ) return -1 ;
02262 
02263    ic = sscanf( cmd+dadd , "%d%d%d" , &i,&j,&k ) ;
02264    if( ic < 3 ) return -1 ;
02265    AFNI_set_viewpoint( im3d , i,j,k , REDISPLAY_ALL ) ;
02266    return 0 ;
02267 }
02268 
02269 
02270 
02271 
02272 static int AFNI_drive_set_xhairs( char *cmd )
02273 {
02274    int ic , dadd=2 , hh=-1 ;
02275    Three_D_View *im3d ;
02276    int i,j,k ;
02277 
02278    if( strlen(cmd) < 3 ) return -1;
02279 
02280    ic = AFNI_controller_code_to_index( cmd ) ;
02281    if( ic < 0 ){ ic = 0 ; dadd = 0 ; }
02282    im3d = GLOBAL_library.controllers[ic] ;
02283    if( !IM3D_OPEN(im3d) ) return -1 ;
02284 
02285         if( strstr(cmd,"OFF")    != NULL ) hh = 0 ;
02286    else if( strstr(cmd,"SINGLE") != NULL ) hh = 1 ;
02287    else if( strstr(cmd,"MULTI")  != NULL ) hh = 2 ;
02288    else if( strstr(cmd,"LR_AP")  != NULL ) hh = 3 ;
02289    else if( strstr(cmd,"LR_IS")  != NULL ) hh = 4 ;
02290    else if( strstr(cmd,"AP_IS")  != NULL ) hh = 5 ;
02291    else if( strstr(cmd,"LR")     != NULL ) hh = 6 ;
02292    else if( strstr(cmd,"AP")     != NULL ) hh = 7 ;
02293    else if( strstr(cmd,"IS")     != NULL ) hh = 8 ;
02294    else                                    return -1 ;
02295 
02296    AV_assign_ival( im3d->vwid->imag->crosshair_av, hh ) ;
02297    AFNI_crosshair_visible_CB( im3d->vwid->imag->crosshair_av, (XtPointer)im3d );
02298    return 0 ;
02299 }