00001 #undef MAIN
00002 
00003 #include "afni.h"
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 int AFNI_vnlist_func_overlay( Three_D_View *im3d, int ks ,
00030                               SUMA_irgba **map, int *nvused )
00031 {
00032    MRI_IMAGE *im_thr , *im_fim ;
00033    short fim_ovc[NPANE_MAX+1] ;
00034    byte  ovc_r[NPANE_MAX+1], ovc_g[NPANE_MAX+1], ovc_b[NPANE_MAX+1] ;
00035    int ii,jj,nn , lp , num_lp , ival ;
00036    float scale_factor , scale_thr=1.0 , scale_fim=1.0 ;
00037    MCW_pbar * pbar ;
00038    int     simult_thr , need_thr ;
00039    THD_3dim_dataset *fdset ;
00040    SUMA_irgba *mmm ;
00041    SUMA_ixyz  *ixyz ;
00042    int nvox,nnod,nout , *numnod , *voxijk , *nlist ;
00043    int *vlist ;
00044    int nvout ;   
00045 
00046    int bm , zbot=0 , kk ;        
00047    float fbot=0.0,ftop=0.0,ffac=0.0 , val ;
00048    rgbyte *cmap=NULL ;
00049 
00050    THD_session *ss ;             
00051    SUMA_surface *surf ;
00052    SUMA_vnlist *vn ;
00053 
00054 ENTRY("AFNI_vnlist_func_overlay") ;
00055 
00056    
00057 
00058    if( map == NULL || !IM3D_VALID(im3d) ) RETURN(-1) ; 
00059 
00060    if( nvused != NULL ) *nvused = 0 ;  
00061 
00062    
00063    
00064 
00065    ss = im3d->ss_now ;              
00066    if( ss              == NULL ||   
00067        ss->su_num      == 0    ||
00068        ks              <  0    ||
00069        ss->su_num      <= ks   ||
00070        ss->su_surf[ks] == NULL   ) RETURN(-1) ;
00071 
00072    surf = ss->su_surf[ks] ;    
00073 
00074    fdset = im3d->fim_now ; if( fdset == NULL ) RETURN(-1) ;
00075 
00076    ival = im3d->vinfo->thr_index ;  
00077 
00078    
00079 
00080    need_thr = im3d->vinfo->func_threshold > 0.0 ;
00081 
00082    if( need_thr ) im_thr = DSET_BRICK(fdset,ival) ;
00083    else           im_thr = NULL ;
00084 
00085    if( im_thr != NULL && !AFNI_GOOD_FUNC_DTYPE(im_thr->kind) ) im_thr = NULL ;
00086 
00087    if( im_thr != NULL ){
00088      scale_thr = DSET_BRICK_FACTOR(fdset,ival) ;
00089      if( scale_thr == 0.0 || im_thr->kind == MRI_float ) scale_thr = 1.0 ;
00090    }
00091 
00092    { int ind ;
00093 
00094      ind = im3d->vinfo->fim_index ;
00095      if( ind >= DSET_NVALS(fdset) )
00096        ind = DSET_NVALS(fdset) - 1 ;
00097 
00098      im_fim       = DSET_BRICK(fdset,ind) ;  
00099      scale_factor = im3d->vinfo->fim_range ;
00100      if( scale_factor == 0.0 ) scale_factor = im3d->vinfo->fim_autorange ;
00101      if( scale_factor == 0.0 ) scale_factor = 1.0 ;
00102 
00103      scale_fim = DSET_BRICK_FACTOR(fdset,ind) ;
00104      if( scale_fim == 0.0 ) scale_fim = 1.0 ;
00105 
00106    }
00107 
00108    
00109 
00110    if( im_fim == NULL ) RETURN(-1) ;  
00111 
00112    if( !AFNI_GOOD_FUNC_DTYPE(im_fim->kind) ){
00113       RETURN(-1) ;  
00114    }
00115 
00116    
00117    
00118 
00119    if( surf->vn == NULL ||
00120        !EQUIV_DATAXES(surf->vn->dset->daxes,fdset->daxes) ){
00121 
00122      
00123 
00124 
00125 
00126      if( surf->vn != NULL ) SUMA_destroy_vnlist( surf->vn ) ;
00127 
00128      
00129 
00130      surf->vn = SUMA_make_vnlist( surf , fdset ) ;
00131      if( surf->vn == NULL ) RETURN(-1) ;
00132    }
00133 
00134    vn = surf->vn ;   
00135 
00136    
00137 
00138 
00139    nvox   = vn->nvox     ; if( nvox < 1 ) RETURN(0);
00140    voxijk = vn->voxijk   ;      
00141    numnod = vn->numnod   ;      
00142 
00143    nnod = surf->num_ixyz ; if( nnod < 1 ) RETURN(0);
00144    ixyz = surf->ixyz     ;      
00145 
00146    DSET_load(fdset) ;                     
00147    if( !DSET_LOADED(fdset) ) RETURN(-1) ; 
00148 
00149 
00150 
00151    if( im_thr == NULL ){
00152 
00153      vlist = voxijk ;  
00154      nout  = nnod   ;  
00155 
00156 
00157 
00158    } else {
00159 
00160      vlist = (int *) malloc(sizeof(int)*nvox) ;    
00161      memcpy( vlist , voxijk , sizeof(int)*nvox ) ; 
00162 
00163      switch( im_thr->kind ){
00164        case MRI_short:{
00165          float thresh = im3d->vinfo->func_threshold
00166                       * im3d->vinfo->func_thresh_top / scale_thr ;
00167          short *ar_thr = MRI_SHORT_PTR(im_thr) ;
00168          for( ii=0 ; ii < nvox ; ii++ ){  
00169            jj = vlist[ii] ;               
00170            if( ar_thr[jj] > -thresh && ar_thr[jj] < thresh ) vlist[ii] = -1 ;
00171          }
00172        }
00173        break ;
00174 
00175        case MRI_byte:{
00176          float thresh = im3d->vinfo->func_threshold
00177                       * im3d->vinfo->func_thresh_top / scale_thr ;
00178          byte *ar_thr = MRI_BYTE_PTR(im_thr) ;
00179          for( ii=0 ; ii < nvox ; ii++ ){
00180            jj = vlist[ii] ;
00181            if( ar_thr[jj] < thresh ) vlist[ii] = -1 ;
00182          }
00183        }
00184        break ;
00185 
00186        case MRI_float:{
00187          float thresh = im3d->vinfo->func_threshold
00188                       * im3d->vinfo->func_thresh_top / scale_thr ;
00189          float *ar_thr = MRI_FLOAT_PTR(im_thr) ;
00190          for( ii=0 ; ii < nvox ; ii++ ){
00191            jj = vlist[ii] ;
00192            if( ar_thr[jj] > -thresh && ar_thr[jj] < thresh ) vlist[ii] = -1 ;
00193          }
00194        }
00195        break ;
00196      } 
00197 
00198      
00199 
00200      for( jj=ii=0 ; ii < nvox ; ii++ )
00201        if( vlist[ii] >= 0 ) jj++ ;
00202      if( jj == 0 ){ free(vlist) ; RETURN(0) ; }
00203 
00204      
00205 
00206      for( nout=ii=0 ; ii < nvox ; ii++ )
00207        if( vlist[ii] >= 0 ) nout += numnod[ii] ;
00208 
00209    } 
00210 
00211 
00212 
00213    mmm = (SUMA_irgba *) malloc( sizeof(SUMA_irgba) * nout ) ;
00214 
00215 
00216 
00217    pbar   = im3d->vwid->func->inten_pbar ;
00218    num_lp = pbar->num_panes ;
00219    bm     = pbar->bigmode ;              
00220 
00221    if( !bm ){                              
00222      for( lp=0 ; lp < num_lp ; lp++ )      
00223        fim_ovc[lp] = pbar->ov_index[lp] ;  
00224 
00225      
00226 
00227      fim_ovc[num_lp] = (im3d->vinfo->use_posfunc) ? (0) : (fim_ovc[num_lp-1]) ;
00228 
00229      
00230 
00231      for( lp=0 ; lp <= num_lp ; lp++ ){
00232        ovc_r[lp] = DCOV_REDBYTE  (im3d->dc,fim_ovc[lp]) ;
00233        ovc_g[lp] = DCOV_GREENBYTE(im3d->dc,fim_ovc[lp]) ;
00234        ovc_b[lp] = DCOV_BLUEBYTE (im3d->dc,fim_ovc[lp]) ;
00235      }
00236 
00237    } else {                                
00238      fbot = (scale_factor/scale_fim)*pbar->bigbot ;
00239      ftop = (scale_factor/scale_fim)*pbar->bigtop ;
00240      ffac = NPANE_BIG / (ftop-fbot) ;
00241      cmap = pbar->bigcolor ;
00242      zbot = (fbot == 0.0) ;
00243    }
00244 
00245 
00246 
00247    switch( im_fim->kind ){
00248 
00249       default: nvout = nout = 0 ; break ;   
00250 
00251       case MRI_rgb:{                        
00252         byte *ar_fim = MRI_RGB_PTR(im_fim); 
00253         byte r,g,b ;
00254 
00255         nvout = nout = 0 ;                  
00256         for( ii=0 ; ii < nvox ; ii++ ){
00257           jj = vlist[ii] ; if( jj < 0 ) continue ;   
00258           r = ar_fim[3*jj]; g = ar_fim[3*jj+1]; b = ar_fim[3*jj+2];
00259           if( r == 0 && g ==0 && b == 0 ) continue ; 
00260           nlist = vn->nlist[ii] ;  
00261           for( nn=0 ; nn < numnod[ii] ; nn++ ){      
00262             mmm[nout].id = ixyz[nlist[nn]].id ;
00263             mmm[nout].r  = r ; mmm[nout].g = g ;
00264             mmm[nout].b  = b ; mmm[nout].a = 255 ; nout++ ;
00265           }
00266           nvout++ ;                           
00267         }
00268       }
00269       break ;
00270 
00271       case MRI_short:{
00272         short * ar_fim = MRI_SHORT_PTR(im_fim) ;
00273         float fim_thr[NPANE_MAX] ;
00274         byte r,g,b ;
00275 
00276         if( !bm ){                         
00277           for( lp=0 ; lp < num_lp ; lp++ ) 
00278             fim_thr[lp] = (scale_factor/scale_fim) * pbar->pval[lp+1] ;
00279         }
00280 
00281         nvout = nout = 0 ;                   
00282         for( ii=0 ; ii < nvox ; ii++ ){
00283           jj = vlist[ii] ; if( jj < 0 ) continue ;  
00284           if( ar_fim[jj] == 0 )         continue ;  
00285           if( !bm ){              
00286             for( lp=0; lp < num_lp && ar_fim[jj] < fim_thr[lp]; lp++ ) ; 
00287             if( fim_ovc[lp] == 0 ) continue ;         
00288             r = ovc_r[lp]; g = ovc_g[lp]; b = ovc_b[lp];
00289           } else {                
00290             if( zbot && ar_fim[jj] < 0 ) continue ;
00291             val = ffac*(ftop-ar_fim[jj]) ;
00292             if( val < 0.0 ) val = 0.0;
00293             kk = (int)(val+0.49); if( kk >= NPANE_BIG ) kk = NPANE_BIG-1;
00294             r = cmap[kk].r; g = cmap[kk].g; b = cmap[kk].b;
00295             if( r == 0 && g ==0 && b == 0 ) continue ; 
00296           }
00297           nlist = vn->nlist[ii] ; 
00298           for( nn=0 ; nn < numnod[ii] ; nn++ ){     
00299             mmm[nout].id = ixyz[nlist[nn]].id ;
00300             mmm[nout].r  = r ; mmm[nout].g = g ;
00301             mmm[nout].b  = b ; mmm[nout].a = 255 ; nout++ ;
00302           }
00303           nvout++ ;                           
00304         }
00305       }
00306       break ;
00307 
00308       case MRI_byte:{
00309         byte * ar_fim = MRI_BYTE_PTR(im_fim) ;
00310         float fim_thr[NPANE_MAX] ;
00311         byte r,g,b ;
00312 
00313         if( !bm ){                         
00314           for( lp=0 ; lp < num_lp ; lp++ )
00315             if( pbar->pval[lp+1] <= 0.0 )
00316               fim_thr[lp] = 0 ;
00317             else
00318               fim_thr[lp] = (scale_factor/scale_fim) * pbar->pval[lp+1] ;
00319         }
00320 
00321         nvout = nout = 0 ;                          
00322         for( ii=0 ; ii < nvox ; ii++ ){
00323           jj = vlist[ii] ; if( jj < 0 ) continue ;  
00324           if( ar_fim[jj] == 0 )         continue ;  
00325           if( !bm ){              
00326             for( lp=0; lp < num_lp && ar_fim[jj] < fim_thr[lp]; lp++ ) ; 
00327             if( fim_ovc[lp] == 0 ) continue ;         
00328             r = ovc_r[lp]; g = ovc_g[lp]; b = ovc_b[lp];
00329           } else {                
00330             val = ffac*(ftop-ar_fim[jj]) ;
00331             if( val < 0.0 ) val = 0.0;
00332             kk = (int)(val+0.49); if( kk >= NPANE_BIG ) kk = NPANE_BIG-1;
00333             r = cmap[kk].r; g = cmap[kk].g; b = cmap[kk].b;
00334             if( r == 0 && g ==0 && b == 0 ) continue ; 
00335           }
00336           nlist = vn->nlist[ii] ; 
00337           for( nn=0 ; nn < numnod[ii] ; nn++ ){     
00338             mmm[nout].id = ixyz[nlist[nn]].id ;
00339             mmm[nout].r  = r ; mmm[nout].g = g ;
00340             mmm[nout].b  = b ; mmm[nout].a = 255 ; nout++ ;
00341           }
00342           nvout++ ;                           
00343         }
00344       }
00345       break ;
00346 
00347       case MRI_float:{
00348         float * ar_fim = MRI_FLOAT_PTR(im_fim) ;
00349         float fim_thr[NPANE_MAX] ;
00350         byte r,g,b ;
00351 
00352         if( !bm ){                         
00353           for( lp=0 ; lp < num_lp ; lp++ )
00354             fim_thr[lp] = (scale_factor/scale_fim) * pbar->pval[lp+1] ;
00355         }
00356 
00357         nvout = nout = 0 ;                          
00358         for( ii=0 ; ii < nvox ; ii++ ){
00359           jj = vlist[ii] ; if( jj < 0 ) continue ;  
00360           if( ar_fim[jj] == 0.0 )       continue ;  
00361           if( !bm ){              
00362             for( lp=0; lp < num_lp && ar_fim[jj] < fim_thr[lp]; lp++ ) ; 
00363             if( fim_ovc[lp] == 0 ) continue ;         
00364             r = ovc_r[lp]; g = ovc_g[lp]; b = ovc_b[lp];
00365           } else {                
00366             if( zbot && ar_fim[jj] < 0.0 ) continue ;
00367             val = ffac*(ftop-ar_fim[jj]) ;
00368             if( val < 0.0 ) val = 0.0;
00369             kk = (int)(val+0.49); if( kk >= NPANE_BIG ) kk = NPANE_BIG-1;
00370             r = cmap[kk].r; g = cmap[kk].g; b = cmap[kk].b;
00371             if( r == 0 && g ==0 && b == 0 ) continue ; 
00372           }
00373           nlist = vn->nlist[ii] ; 
00374           for( nn=0 ; nn < numnod[ii] ; nn++ ){     
00375             mmm[nout].id = ixyz[nlist[nn]].id ;
00376             mmm[nout].r  = r ; mmm[nout].g = g ;
00377             mmm[nout].b  = b ; mmm[nout].a = 255 ; nout++ ;
00378           }
00379           nvout++ ;                           
00380         }
00381       }
00382       break ;
00383 
00384    } 
00385 
00386 
00387 
00388    if( vlist != voxijk ) free(vlist) ;  
00389 
00390    if( nout == 0 ){ free(mmm); RETURN(0); }  
00391 
00392    
00393 
00394    *map = (SUMA_irgba *) realloc( mmm , sizeof(SUMA_irgba)*nout ) ;
00395 
00396    
00397 
00398    if( nvused != NULL ) *nvused = nvout ;    
00399 
00400    RETURN(nout) ;  
00401 }
00402 
00403 
00404 
00405 
00406 
00407 
00408 
00409 int AFNI_find_closest_node( int num_ixyz , SUMA_ixyz *ixyz ,
00410                             float xtarg, float ytarg, float ztarg,
00411                             float xbot , float xtop ,
00412                             float ybot , float ytop ,
00413                             float zbot , float ztop  )
00414 {
00415    int ii ,      ibest=-1 ;
00416    float x,y,z , dbest, d ;
00417 
00418 ENTRY("AFNI_find_closest_node") ;
00419 
00420    if( num_ixyz <= 0 || ixyz == NULL ) RETURN(-1) ;  
00421 
00422    
00423 
00424    if( xbot >= xtop ){ xbot = -WAY_BIG; xtop = WAY_BIG; }
00425    if( ybot >= ytop ){ ybot = -WAY_BIG; ytop = WAY_BIG; }
00426    if( zbot >= ztop ){ zbot = -WAY_BIG; ztop = WAY_BIG; }
00427 
00428    for( ii=0 ; ii < num_ixyz ; ii++ ){
00429      x = ixyz[ii].x; y = ixyz[ii].y; z = ixyz[ii].z;
00430      if( x < xbot || x > xtop ||
00431          y < ybot || y > ytop ||
00432          z < zbot || z > ztop   ) continue ;  
00433 
00434      d = (xtarg-x)*(xtarg-x) + (ytarg-y)*(ytarg-y) + (ztarg-z)*(ztarg-z) ;
00435      if( ibest < 0 || d < dbest ){ ibest = ii; dbest = d; }
00436    }
00437 
00438    RETURN(ibest) ;
00439 }
00440 
00441 
00442 
00443 
00444 static void AFNI_surf_done_CB( Widget,XtPointer,XtPointer ) ;
00445 static void AFNI_surf_redraw_CB( MCW_arrowval *,XtPointer ) ;
00446 static AFNI_make_surface_widgets( Three_D_View *, int ) ;
00447 static void AFNI_surf_bbox_CB( Widget,XtPointer,XtPointer ) ; 
00448 
00449 
00450 
00451 
00452 
00453 #undef  MAKE_SURF_ROW
00454 #define MAKE_SURF_ROW(ii)                                          \
00455  do{ Widget rc ; char *str[1]={"abcdefghijklmn: "} ;               \
00456      rc = swid->surf_rc[ii] =                                      \
00457          XtVaCreateWidget(                                         \
00458            "dialog" , xmRowColumnWidgetClass , swid->rowcol ,      \
00459               XmNpacking      , XmPACK_TIGHT ,                     \
00460               XmNorientation  , XmHORIZONTAL   ,                   \
00461               XmNtraversalOn , False ,                             \
00462            NULL ) ;                                                \
00463      swid->surf_bbox[ii] = new_MCW_bbox( rc , 1 , str ,            \
00464                              MCW_BB_check, MCW_BB_noframe,         \
00465                              AFNI_surf_bbox_CB , im3d ) ;          \
00466      MCW_set_bbox( swid->surf_bbox[ii] , 1 ) ;                     \
00467      MCW_reghelp_children( swid->surf_bbox[ii]->wrowcol ,          \
00468                            "Use this toggle to turn the\n"         \
00469                            "overlay drawing for this surface\n"    \
00470                            "off and back on."                  ) ; \
00471      swid->surf_node_av[ii] = new_MCW_colormenu( rc ,              \
00472                                "Nodes" , im3d->dc ,                \
00473                                0 , im3d->dc->ovc->ncol_ov-1 ,      \
00474                                box_col ,                           \
00475                                AFNI_surf_redraw_CB , im3d ) ;      \
00476      swid->surf_line_av[ii] = new_MCW_colormenu( rc ,              \
00477                                "Lines" , im3d->dc ,                \
00478                                0 , im3d->dc->ovc->ncol_ov-1 ,      \
00479                                line_col ,                          \
00480                                AFNI_surf_redraw_CB , im3d ) ;      \
00481      swid->surf_ledg_av[ii] = new_MCW_colormenu( rc ,              \
00482                                "+/-" , im3d->dc ,                  \
00483                                0 , im3d->dc->ovc->ncol_ov-1 , 0 ,  \
00484                                AFNI_surf_redraw_CB , im3d ) ;      \
00485      MCW_reghint_children( swid->surf_node_av[ii]->wrowcol ,       \
00486                            "Color of node boxes" ) ;               \
00487      MCW_reghelp_children( swid->surf_node_av[ii]->wrowcol ,       \
00488                            "If this is not 'none', then\n"         \
00489                            "a box will be drawn around the\n"      \
00490                            "location of each surface node\n"       \
00491                            "inside the slice volume."        ) ;   \
00492      MCW_reghint_children( swid->surf_line_av[ii]->wrowcol ,       \
00493                            "Color of triangle lines" ) ;           \
00494      MCW_reghelp_children( swid->surf_line_av[ii]->wrowcol ,       \
00495                            "If this is not 'none', then\n"         \
00496                            "line segments will be drawn for the\n" \
00497                            "intersection of each surface facet\n"  \
00498                            "with the slice center plane."       ); \
00499      MCW_reghelp_children( swid->surf_ledg_av[ii]->wrowcol ,       \
00500                            "If this is not 'none', then\n"         \
00501                            "line segments will be drawn for the\n" \
00502                            "intersection of each surface facet\n"  \
00503                            "with the slice edge planes (+/-)." ) ; \
00504   } while(0)
00505 
00506 
00507 
00508 
00509 
00510 
00511 
00512 
00513 static AFNI_make_surface_widgets( Three_D_View *im3d, int num )
00514 {
00515    AFNI_surface_widgets *swid ;
00516    Widget ww , rc ;
00517    XmString xstr ;
00518    char str[32] , *eee ;
00519    int ii , line_col, box_col ;
00520 
00521    im3d->vwid->view->swid = swid = myXtNew( AFNI_surface_widgets ) ;
00522 
00523    
00524 
00525    sprintf(str,"AFNI Surface Controls %s",AFNI_controller_label(im3d)) ;
00526 
00527    swid->wtop = XtVaAppCreateShell(
00528                   "AFNI" , "AFNI" ,
00529                    topLevelShellWidgetClass , im3d->dc->display ,
00530                    XmNallowShellResize   , True ,
00531                    XmNtitle              , str ,
00532                    XmNmappedWhenManaged  , False ,              
00533                    XmNdeleteResponse     , XmDO_NOTHING ,       
00534                 NULL ) ;
00535    DC_yokify( swid->wtop , im3d->dc ) ;
00536 
00537    XtVaSetValues( swid->wtop ,
00538                      XmNmwmDecorations , MWM_DECOR_ALL | MWM_DECOR_MAXIMIZE ,
00539                   NULL ) ;
00540 
00541    XmAddWMProtocolCallback(           
00542            swid->wtop ,
00543            XmInternAtom( im3d->dc->display , "WM_DELETE_WINDOW" , False ) ,
00544            AFNI_surf_done_CB , im3d ) ;
00545 
00546    
00547 
00548    swid->rowcol =
00549       XtVaCreateWidget(
00550          "dialog" , xmRowColumnWidgetClass , swid->wtop ,
00551             XmNpacking      , XmPACK_TIGHT ,
00552             XmNorientation  , XmVERTICAL   ,
00553             XmNtraversalOn , False ,
00554          NULL ) ;
00555 
00556    
00557 
00558    xstr = XmStringCreateLtoR( "xxxxxxxxxAxxxxxxxxxAxxxxxxxxxAxxxxxxxxxAxxxxxxxxxA [x] " ,
00559                               XmFONTLIST_DEFAULT_TAG ) ;
00560    swid->top_lab = XtVaCreateManagedWidget(
00561                     "dialog" , xmLabelWidgetClass , swid->rowcol ,
00562                        XmNrecomputeSize , False ,
00563                        XmNlabelString , xstr ,
00564                        XmNtraversalOn , False ,
00565                     NULL ) ;
00566    XmStringFree(xstr) ;
00567 
00568    
00569 
00570    (void) XtVaCreateManagedWidget( "dialog", xmSeparatorWidgetClass,swid->rowcol,
00571                                       XmNseparatorType   , XmSHADOW_ETCHED_IN ,
00572                                       XmNshadowThickness , 5 ,
00573                                    NULL ) ;
00574 
00575    
00576 
00577    rc = XtVaCreateWidget(
00578           "dialog" , xmRowColumnWidgetClass , swid->rowcol ,
00579              XmNpacking      , XmPACK_TIGHT ,
00580              XmNorientation  , XmHORIZONTAL   ,
00581              XmNtraversalOn , False ,
00582           NULL ) ;
00583 
00584    
00585 
00586    swid->boxsize_av = new_MCW_optmenu( rc , "BoxSize" ,
00587                                        1,19,2,0 ,
00588                                        AFNI_surf_redraw_CB , im3d ,
00589                                        NULL , NULL ) ;
00590    MCW_reghint_children( swid->boxsize_av->wrowcol ,
00591                          "Size of boxes drawn at nodes" ) ;
00592    MCW_reghelp_children( swid->boxsize_av->wrowcol ,
00593                          "This sets the size of the\n"
00594                          "boxes used to draw the\n"
00595                          "surface nodes that are\n"
00596                          "in the current slice volume." ) ;
00597 
00598    
00599 
00600    (void) XtVaCreateManagedWidget( "dialog", xmSeparatorWidgetClass, rc ,
00601                                       XmNorientation   , XmVERTICAL    ,
00602                                       XmNseparatorType , XmDOUBLE_LINE ,
00603                                    NULL ) ;
00604 
00605    swid->linewidth_av = new_MCW_optmenu( rc , "LineWidth" ,
00606                                          0,19,0,0 ,
00607                                          AFNI_surf_redraw_CB , im3d ,
00608                                          NULL , NULL ) ;
00609    MCW_reghint_children( swid->linewidth_av->wrowcol ,
00610                          "Width of lines drawn for surface" ) ;
00611    MCW_reghelp_children( swid->linewidth_av->wrowcol ,
00612                          "This sets the thickness of\n"
00613                          "the lines used to draw the\n"
00614                          "intersection of the surface\n"
00615                          "with the slice plane."         ) ;
00616 
00617 
00618    
00619 
00620    (void) XtVaCreateManagedWidget( "dialog", xmSeparatorWidgetClass, rc ,
00621                                       XmNorientation   , XmVERTICAL    ,
00622                                       XmNseparatorType , XmDOUBLE_LINE ,
00623                                    NULL ) ;
00624 
00625    xstr = XmStringCreateLtoR( "Done" , XmFONTLIST_DEFAULT_TAG ) ;
00626    swid->done_pb =
00627      XtVaCreateManagedWidget(
00628            "dialog" , xmPushButtonWidgetClass , rc ,
00629             XmNlabelString , xstr ,
00630             XmNtraversalOn , False ,
00631          NULL ) ;
00632    XmStringFree(xstr) ;
00633    XtAddCallback( swid->done_pb, XmNactivateCallback, AFNI_surf_done_CB, im3d );
00634    MCW_set_widget_bg( swid->done_pb, MCW_hotcolor(swid->done_pb), 0 ) ;
00635    MCW_register_hint( swid->done_pb, "Close window" ) ;
00636 
00637    XtManageChild(rc) ;
00638 
00639    
00640 
00641    (void) XtVaCreateManagedWidget( "dialog", xmSeparatorWidgetClass,swid->rowcol,
00642                                       XmNseparatorType   , XmSHADOW_ETCHED_IN ,
00643                                       XmNshadowThickness , 5 ,
00644                                    NULL ) ;
00645 
00646    
00647 
00648    swid->nall = num ;
00649    swid->nrow = 0 ;     
00650 
00651    swid->surf_rc      = (Widget *)        XtCalloc( num , sizeof(Widget)         ) ;
00652    swid->surf_bbox    = (MCW_bbox **)     XtCalloc( num , sizeof(MCW_bbox *)     ) ;
00653    swid->surf_node_av = (MCW_arrowval **) XtCalloc( num , sizeof(MCW_arrowval *) ) ;
00654    swid->surf_line_av = (MCW_arrowval **) XtCalloc( num , sizeof(MCW_arrowval *) ) ;
00655    swid->surf_ledg_av = (MCW_arrowval **) XtCalloc( num , sizeof(MCW_arrowval *) ) ;
00656 
00657    eee = getenv( "AFNI_SUMA_LINECOLOR" ) ;
00658    line_col = DC_find_closest_overlay_color( im3d->dc, eee ) ;
00659    if( line_col < 0 ) line_col = MIN(6,im3d->dc->ovc->ncol_ov-1) ;
00660 
00661    eee = getenv( "AFNI_SUMA_BOXCOLOR" ) ;
00662    box_col = DC_find_closest_overlay_color( im3d->dc, eee ) ;
00663    if( box_col < 0 ) box_col = 0 ;
00664 
00665    for( ii=0 ; ii < num ; ii++ ){
00666      MAKE_SURF_ROW(ii) ;
00667    }
00668 
00669    XtManageChild(swid->rowcol) ;
00670    XtRealizeWidget(swid->wtop) ;
00671    EXRETURN ;
00672 }
00673 
00674 
00675 
00676 
00677 
00678 void AFNI_update_surface_widgets( Three_D_View *im3d )
00679 {
00680    AFNI_surface_widgets *swid ;
00681    int num , ii , nwid,nall ;
00682    char str[64] , nam[THD_MAX_NAME] , *tnam ;
00683 
00684 ENTRY("AFNI_update_surface_widgets") ;
00685 
00686    if( !IM3D_OPEN(im3d) || im3d->ss_now == NULL ) EXRETURN ;  
00687 
00688    num  = im3d->ss_now->su_num ;   
00689    swid = im3d->vwid->view->swid ; 
00690 
00691    SENSITIZE( im3d->vwid->view->choose_surf_pb , (Boolean)(num > 0) ) ;
00692 
00693    if( swid == NULL ) EXRETURN ;  
00694 
00695    
00696 
00697    strcpy( nam , im3d->ss_now->sessname ) ;
00698    tnam = THD_trailname(nam,SESSTRAIL+1) ;
00699    ii = strlen(tnam) ; if( ii > 50 ) tnam += (ii-50) ;
00700    sprintf(str ,"%-.50s %s" , tnam, AFNI_controller_label(im3d) ) ;
00701    MCW_set_widget_label( swid->top_lab , str ) ;
00702 
00703    
00704 
00705    if( swid->nall < num ){
00706      char *eee ; int line_col,box_col ;
00707 
00708      swid->surf_rc      = (Widget *)        XtRealloc( (char *)swid->surf_rc     ,num*sizeof(Widget)         );
00709      swid->surf_bbox    = (MCW_bbox **)     XtRealloc( (char *)swid->surf_bbox   ,num*sizeof(MCW_bbox *)     );
00710      swid->surf_node_av = (MCW_arrowval **) XtRealloc( (char *)swid->surf_node_av,num*sizeof(MCW_arrowval *) );
00711      swid->surf_line_av = (MCW_arrowval **) XtRealloc( (char *)swid->surf_line_av,num*sizeof(MCW_arrowval *) );
00712      swid->surf_ledg_av = (MCW_arrowval **) XtRealloc( (char *)swid->surf_line_av,num*sizeof(MCW_arrowval *) );
00713 
00714 
00715      eee = getenv( "AFNI_SUMA_LINECOLOR" ) ;
00716      line_col = DC_find_closest_overlay_color( im3d->dc, eee ) ;
00717      if( line_col < 0 ) line_col = MIN(6,im3d->dc->ovc->ncol_ov-1) ;
00718 
00719      eee = getenv( "AFNI_SUMA_BOXCOLOR" ) ;
00720      box_col = DC_find_closest_overlay_color( im3d->dc, eee ) ;
00721      if( box_col < 0 ) box_col = 0 ;
00722 
00723      for( ii=swid->nall ; ii < num ; ii++ ){
00724        MAKE_SURF_ROW(ii) ;
00725      }
00726      swid->nall = num ;
00727    }
00728 
00729    
00730 
00731    if( swid->nrow < num ){
00732      for( ii=swid->nrow ; ii < num ; ii++ )
00733        XtManageChild( swid->surf_rc[ii] ) ;
00734    } else if( swid->nrow > num ){
00735       for( ii=num ; ii < swid->nrow ; ii++ )
00736        XtUnmanageChild( swid->surf_rc[ii] ) ;
00737    }
00738    swid->nrow = num ;  
00739 
00740    
00741 
00742    for( ii=0 ; ii < num ; ii++ ){
00743      sprintf(str,"%-14.14s: ",im3d->ss_now->su_surf[ii]->label) ;
00744      MCW_set_widget_label( swid->surf_bbox[ii]->wbut[0] , str ) ;
00745 
00746      sprintf(str,"%d Nodes; %d Triangles",             
00747              im3d->ss_now->su_surf[ii]->num_ixyz ,     
00748              im3d->ss_now->su_surf[ii]->num_ijk   ) ;  
00749      MCW_register_hint( swid->surf_bbox[ii]->wbut[0] , str ) ;
00750    }
00751 
00752    EXRETURN ;
00753 }
00754 
00755 
00756 
00757 
00758 void AFNI_update_all_surface_widgets( THD_session *sess )
00759 {
00760    int ii ;
00761    Three_D_View *im3d ;
00762 ENTRY("AFNI_update_all_surface_widgets") ;
00763    for( ii=0 ; ii < MAX_CONTROLLERS ; ii++ ){
00764      im3d = GLOBAL_library.controllers[ii] ;
00765      if( IM3D_OPEN(im3d) && im3d->ss_now == sess )
00766        AFNI_update_surface_widgets( im3d ) ;
00767    }
00768    EXRETURN ;
00769 }
00770 
00771 
00772 
00773 
00774 
00775 void AFNI_choose_surface_CB( Widget w , XtPointer cd, XtPointer cbs )
00776 {
00777    Three_D_View *im3d = (Three_D_View *) cd ;
00778    AFNI_surface_widgets *swid ;
00779    int num , ii , nwid,nall ;
00780 
00781 ENTRY("AFNI_choose_surface_CB") ;
00782 
00783    if( !IM3D_OPEN(im3d) || im3d->ss_now == NULL ) EXRETURN ;  
00784 
00785    num  = im3d->ss_now->su_num ;
00786    swid = im3d->vwid->view->swid ;
00787 
00788    
00789 
00790    if( num == 0 ) EXRETURN ;
00791 
00792    
00793 
00794    if( swid == NULL ){
00795      AFNI_make_surface_widgets(im3d,num) ;
00796      swid = im3d->vwid->view->swid ;
00797    }
00798 
00799    
00800 
00801    XtMapWidget( swid->wtop ) ;
00802    XRaiseWindow( XtDisplay(swid->wtop), XtWindow(swid->wtop) ) ;
00803 
00804    
00805 
00806    AFNI_update_surface_widgets(im3d) ;
00807 
00808    
00809 
00810 
00811    WAIT_for_window( swid->rowcol ) ;
00812    XtUnmanageChild( swid->rowcol ) ;
00813    WAIT_for_window( swid->rowcol ) ;
00814    XtManageChild  ( swid->rowcol ) ;
00815 
00816    
00817 
00818    EXRETURN ;
00819 }
00820 
00821 
00822 
00823 
00824 static void AFNI_surf_done_CB( Widget w , XtPointer cd, XtPointer cbs )
00825 {
00826    Three_D_View *im3d = (Three_D_View *) cd ;
00827    AFNI_surface_widgets *swid ;
00828 
00829 ENTRY("AFNI_surf_done_CB") ;
00830 
00831    if( !IM3D_OPEN(im3d) ) EXRETURN ;
00832    swid = im3d->vwid->view->swid ;
00833    if( swid != NULL ) XtUnmapWidget( swid->wtop ) ;
00834    EXRETURN ;
00835 }
00836 
00837 
00838 
00839 
00840 
00841 
00842 static void AFNI_surf_redraw_CB( MCW_arrowval *av , XtPointer cd )
00843 {
00844    Three_D_View *im3d = (Three_D_View *) cd ;
00845    AFNI_surface_widgets *swid ;
00846 
00847 ENTRY("AFNI_surf_redraw_CB") ;
00848 
00849    if( im3d == NULL ) EXRETURN ;
00850    swid = im3d->vwid->view->swid ;
00851    if( swid == NULL ) EXRETURN ;    
00852 
00853    if( !IM3D_OPEN(im3d) ){          
00854      XtUnmapWidget( swid->wtop ) ;
00855      EXRETURN ;
00856    }
00857 
00858    AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
00859 
00860    EXRETURN ;
00861 }
00862 
00863 
00864 
00865 
00866 
00867 static void AFNI_surf_bbox_CB( Widget w , XtPointer cd , XtPointer qd )
00868 {
00869    Three_D_View *im3d = (Three_D_View *) cd ;
00870    AFNI_surface_widgets *swid ;
00871 
00872 ENTRY("AFNI_surf_bbox_CB") ;
00873 
00874    if( im3d == NULL ) EXRETURN ;
00875    swid = im3d->vwid->view->swid ;
00876    if( swid == NULL ) EXRETURN ;  
00877 
00878    if( !IM3D_OPEN(im3d) ){        
00879      XtUnmapWidget( swid->wtop ) ;
00880      EXRETURN ;
00881    }
00882 
00883    AFNI_set_viewpoint( im3d , -1,-1,-1 , REDISPLAY_OVERLAY ) ;
00884 
00885    EXRETURN ;
00886 }