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 }