Doxygen Source Code Documentation
SUMA_niml.c File Reference
#include "SUMA_suma.h"Go to the source code of this file.
Define Documentation
|
|
Value: { \
if (node) SUMA_free(node); node = NULL; \
if (CM) SUMA_Free_ColorMap (CM); CM = NULL; \
if (OptScl) SUMA_free(OptScl); OptScl = NULL; \
if (SV) SUMA_Free_ColorScaledVect (SV); SV = NULL; \
if (rgba) SUMA_free(rgba); rgba = NULL; \
}Definition at line 2791 of file SUMA_niml.c. Referenced by SUMA_NodeVal2irgba_nel(). |
|
|
Value: { \
\
SUMA_LH("Cleanup for SUMA_NodeVal2irgba_nel..."); \
SUMA_NodeVal2irgba_nel (NULL, NULL, NULL, 1); \
SUMA_LH("Cleanup for SUMA_NodeXYZ2NodeXYZ_nel..."); \
SUMA_NodeXYZ2NodeXYZ_nel (NULL, NULL, 1, SUMA_NODE_XYZ); \
SUMA_LH("Cleanup for SUMA_Mesh_IJK2Mesh_IJK_nel..."); \
SUMA_Mesh_IJK2Mesh_IJK_nel (NULL, NULL, 1, SUMA_NEW_MESH_IJK); \
}Definition at line 3003 of file SUMA_niml.c. Referenced by SUMA_SendToSuma(). |
Function Documentation
|
||||||||||||||||
|
assign new afni host name SUMA_Assign_HostName (cf, HostName, istream) Assigns a new HostName for niml communication on a particular stream
Definition at line 2127 of file SUMA_niml.c. References SUMA_CommonFields::HostName_v, i, LocalHead, SUMA_CommonFields::NimlStream_v, SUMA_AFNI_STREAM_INDEX, SUMA_Boolean, SUMA_ENTRY, SUMA_MAX_NAME_LENGTH, SUMA_MAX_STREAMS, SUMA_RETURN, and SUMA_CommonFields::TCP_port. Referenced by main(), SUMA_SendToAfni(), and SUMA_SendToSuma().
02128 {
02129 static char FuncName[]={"SUMA_Assign_HostName"};
02130 int istart = 0, istop = 0, i = 0;
02131 SUMA_Boolean LocalHead = NOPE;
02132
02133 SUMA_ENTRY;
02134
02135 if (istream == -1) {
02136 istart = 0; istop = SUMA_MAX_STREAMS;
02137 } else {
02138 istart = istream; istop = istream + 1;
02139 }
02140
02141 for (i = istart; i < istop; ++i) {
02142 if (HostName == NULL)
02143 if (i == SUMA_AFNI_STREAM_INDEX) {
02144 sprintf(cf->HostName_v[i], "localhost"); /* using localhost will allow the use of Shared Memory.
02145 That is only allowed for SUMA<-->AFNI */
02146 } else {
02147 sprintf(cf->HostName_v[i], "127.0.0.1"); /* force TCP for the commoners */
02148 }
02149 else {
02150 if (strlen(HostName) > SUMA_MAX_NAME_LENGTH - 20) {
02151 fprintf(SUMA_STDERR,"Error %s: too long a host name (> %d chars).\n", FuncName, SUMA_MAX_NAME_LENGTH - 20);
02152 SUMA_RETURN (NOPE);
02153 }
02154 sprintf(cf->HostName_v[i],"%s", HostName);
02155 }
02156
02157 sprintf(cf->NimlStream_v[i],"tcp:%s:%d",
02158 cf->HostName_v[i], cf->TCP_port[i]);
02159
02160 if (LocalHead) fprintf(SUMA_STDOUT, "%s: Set HostName %d to %s (stream name: %s)\n",
02161 FuncName, i, cf->HostName_v[i], cf->NimlStream_v[i]);
02162 }
02163
02164 SUMA_RETURN (YUP);
02165 }
|
|
||||||||||||
|
ans = SUMA_CanTalkToAfni (dov, N_dov); determines if any of the Surface Viewers is allowed to talk to afni
Definition at line 1481 of file SUMA_niml.c. References i, SUMA_SurfaceObject::LocalDomainParentID, SUMA_Boolean, SUMA_ENTRY, SUMA_isSO(), SUMA_RETURN, and SUMA_SurfaceObject::VolPar. Referenced by SUMA_Engine().
01482 {
01483 static char FuncName[]={"SUMA_CanTalkToAfni"};
01484 int i;
01485 SUMA_SurfaceObject *SO;
01486
01487 SUMA_ENTRY;
01488
01489 for (i=0; i< N_dov; ++i) {
01490 if (SUMA_isSO(dov[i])) {
01491 SO = (SUMA_SurfaceObject *)(dov[i].OP);
01492 if (SO->LocalDomainParentID != NULL && SO->VolPar != NULL) {
01493 SUMA_RETURN (YUP);
01494 }
01495 }
01496 }
01497
01498 SUMA_RETURN (NOPE);
01499 }
|
|
|
|
A function to take a SUMA_DRAWN_ROI struct and return an equivalent SUMA_NIML_DRAWN_ROI struct.
Definition at line 1688 of file SUMA_niml.c. References SUMA_ROI_DATUM::action, SUMA_NIML_DRAWN_ROI::ColPlaneName, SUMA_DRAWN_ROI::ColPlaneName, DListElmt_::data, dlist_head, dlist_size, dlist_tail, SUMA_NIML_DRAWN_ROI::EdgeColor, SUMA_DRAWN_ROI::EdgeColor, SUMA_NIML_DRAWN_ROI::EdgeThickness, SUMA_DRAWN_ROI::EdgeThickness, SUMA_NIML_DRAWN_ROI::FillColor, SUMA_DRAWN_ROI::FillColor, i, SUMA_NIML_DRAWN_ROI::idcode_str, SUMA_DRAWN_ROI::idcode_str, SUMA_NIML_DRAWN_ROI::iLabel, SUMA_DRAWN_ROI::iLabel, SUMA_NIML_DRAWN_ROI::Label, SUMA_DRAWN_ROI::Label, LocalHead, SUMA_ROI_DATUM::N_n, SUMA_NIML_DRAWN_ROI::N_ROI_datum, DListElmt_::next, SUMA_ROI_DATUM::nPath, SUMA_NIML_DRAWN_ROI::Parent_idcode_str, SUMA_DRAWN_ROI::Parent_idcode_str, SUMA_NIML_DRAWN_ROI::ROI_datum, SUMA_DRAWN_ROI::ROIstrokelist, SUMA_Boolean, SUMA_ENTRY, SUMA_malloc, SUMA_RETURN, SUMA_SL_Err, SUMA_NIML_DRAWN_ROI::Type, SUMA_DRAWN_ROI::Type, and SUMA_ROI_DATUM::Type. Referenced by SUMA_Write_DrawnROI_NIML().
01689 {
01690 static char FuncName[]={"SUMA_DrawnROI_to_NIMLDrawnROI"};
01691 SUMA_NIML_DRAWN_ROI *nimlROI=NULL;
01692 SUMA_ROI_DATUM *ROI_Datum=NULL;
01693 DListElmt *Elm = NULL;
01694 int i = -1;
01695 SUMA_Boolean LocalHead = NOPE;
01696
01697 SUMA_ENTRY;
01698
01699 if (!ROI) {
01700 SUMA_SL_Err("Null ROI");
01701 SUMA_RETURN(NULL);
01702 }
01703
01704 /* allocate for nimlROI */
01705 nimlROI = (SUMA_NIML_DRAWN_ROI *)SUMA_malloc(sizeof(SUMA_NIML_DRAWN_ROI));
01706
01707 nimlROI->Type = (int)ROI->Type;
01708 nimlROI->idcode_str = ROI->idcode_str;
01709 nimlROI->Parent_idcode_str = ROI->Parent_idcode_str;
01710 nimlROI->Label = ROI->Label;
01711 nimlROI->iLabel = ROI->iLabel;
01712 nimlROI->N_ROI_datum = dlist_size(ROI->ROIstrokelist);
01713 nimlROI->ColPlaneName = ROI->ColPlaneName;
01714 nimlROI->FillColor[0] = ROI->FillColor[0];
01715 nimlROI->FillColor[1] = ROI->FillColor[1];
01716 nimlROI->FillColor[2] = ROI->FillColor[2];
01717 nimlROI->EdgeColor[0] = ROI->EdgeColor[0];
01718 nimlROI->EdgeColor[1] = ROI->EdgeColor[1];
01719 nimlROI->EdgeColor[2] = ROI->EdgeColor[2];
01720 nimlROI->EdgeThickness = ROI->EdgeThickness;
01721 if (!nimlROI->N_ROI_datum) {
01722 nimlROI->ROI_datum = NULL;
01723 SUMA_RETURN(nimlROI);
01724 }
01725 nimlROI->ROI_datum = (SUMA_NIML_ROI_DATUM *)SUMA_malloc(nimlROI->N_ROI_datum*sizeof(SUMA_NIML_ROI_DATUM));
01726
01727 /* now fill the ROI_datum structures */
01728 Elm = NULL;
01729 i = 0;
01730 do {
01731 if (!Elm) Elm = dlist_head(ROI->ROIstrokelist);
01732 else Elm = Elm->next;
01733 ROI_Datum = (SUMA_ROI_DATUM *)Elm->data;
01734 nimlROI->ROI_datum[i].action = ROI_Datum->action;
01735 nimlROI->ROI_datum[i].Type = ROI_Datum->Type;
01736 nimlROI->ROI_datum[i].N_n = ROI_Datum->N_n;
01737 nimlROI->ROI_datum[i].nPath = ROI_Datum->nPath;
01738
01739 /*
01740 nimlROI->ROI_datum[i].N_t = ROI_Datum->N_t;
01741 nimlROI->ROI_datum[i].tPath = ROI_Datum->tPath; */
01742 ++i;
01743 } while (Elm != dlist_tail(ROI->ROIstrokelist));
01744
01745 SUMA_RETURN(nimlROI);
01746 }
|
|
|
Definition at line 1912 of file SUMA_niml.c. References calloc, free, i, SUMA_NIML_DRAWN_ROI::idcode_str, SUMA_NIML_DRAWN_ROI::iLabel, SUMA_NIML_DRAWN_ROI::Label, malloc, SUMA_NIML_ROI_DATUM::N_n, SUMA_NIML_DRAWN_ROI::N_ROI_datum, NI_element::name, ROI::name, NI_add_column(), NI_free_element(), NI_get_attribute(), NI_HEADERSHARP_FLAG, NI_new_data_element(), NI_read_element(), NI_rowtype_define(), NI_set_attribute(), NI_stream_close(), NI_stream_open(), NI_strncpy(), NI_TEXT_MODE, NI_write_element(), ROI_seg::nod, SUMA_NIML_ROI_DATUM::nPath, ROI_seg::num_nod, ROI::num_seg, SUMA_NIML_DRAWN_ROI::Parent_idcode_str, SUMA_NIML_DRAWN_ROI::ROI_datum, ROI::seg, strtod(), SUMA_NIML_DRAWN_ROI::Type, ROI::val, NI_element::vec, NI_element::vec_len, NI_element::vec_num, and NI_element::vec_typ.
01913 {
01914 if (!Solo) {
01915 ROI *myroi ;
01916 ROI_seg *myseg , *inseg ;
01917 int roi_type ;
01918 NI_element *nel ;
01919 NI_stream ns ;
01920 char *atr ;
01921 int nseg,ii , nnod,jj ;
01922
01923 /* define struct to read from element */
01924
01925 roi_type = NI_rowtype_define( "ROI_seg" , "int,int[#1]" ) ;
01926 printf("roi_type code = %d\n",roi_type) ;
01927
01928 /* open file and read 1 data element */
01929
01930 ns = NI_stream_open( "file:qroi.dat" , "r" ) ;
01931 if( ns == NULL ){
01932 fprintf(stderr,"Can't open qroi.dat!\n"); exit(1);
01933 }
01934 nel = NI_read_element(ns,1) ; NI_stream_close(ns) ;
01935 if( nel == NULL ){
01936 fprintf(stderr,"Can't read element from qroi.dat!\n"); exit(1);
01937 }
01938
01939 /* check input element name and type */
01940
01941 printf("element name = %s\n",nel->name) ;
01942 printf(" nel->vec_num = %d\n",nel->vec_num) ; /* # of vectors */
01943 printf(" nel->vec_type[0] = %d\n",nel->vec_typ[0]) ; /* type of vec #0 */
01944 if( strcmp(nel->name,"ROI") != 0 ) exit(1) ;
01945
01946 myroi = malloc(sizeof(ROI)) ; /* create output ROI struct */
01947 atr = NI_get_attribute( nel , "ROI_val") ; /* set ROI val from attribute */
01948 myroi->val = (atr == NULL) ? 0.0 : strtod(atr,NULL) ;
01949 atr = NI_get_attribute( nel , "ROI_name") ; /* set ROI name from attribute */
01950 NI_strncpy(myroi->name,atr,128) ;
01951 myroi->num_seg = nseg = nel->vec_len ; /* element is array of ROI_seg */
01952 inseg = nel->vec[0] ; /* input array of ROI_seg */
01953 myroi->seg = malloc(sizeof(ROI_seg)*nseg); /* make output array of ROI_seg */
01954
01955 for( ii=0 ; ii < nseg ; ii++ ){ /* copy input array to output array */
01956 myroi->seg[ii].num_nod = nnod = inseg[ii].num_nod ;
01957 if( nnod > 0 ){
01958 myroi->seg[ii].nod = malloc(sizeof(int)*nnod) ;
01959 memcpy( myroi->seg[ii].nod , inseg[ii].nod , sizeof(int)*nnod ) ;
01960 } else {
01961 myroi->seg[ii].nod = NULL ;
01962 }
01963 }
01964
01965 printf(" val = %g\n"
01966 " name = %s\n"
01967 " num_seg= %d\n" , myroi->val , myroi->name , myroi->num_seg ) ;
01968 for( ii=0 ; ii < nseg ; ii++ ){
01969 printf(" Segment #%d has %d nodes:",ii,myroi->seg[ii].num_nod) ;
01970 for( jj=0 ; jj < myroi->seg[ii].num_nod ; jj++ )
01971 printf(" %d",myroi->seg[ii].nod[jj]) ;
01972 printf("\n") ;
01973 }
01974
01975 printf("\nWriting element to stdout\n") ; fflush(stdout) ;
01976 ns = NI_stream_open( "stdout:" , "w" ) ;
01977 NI_write_element( ns , nel , NI_TEXT_MODE | NI_HEADERSHARP_FLAG ) ;
01978 NI_stream_close( ns ) ; NI_free_element(nel) ;
01979 }
01980 /*********Me ROI*********/
01981 {
01982 char *idcode_str, *Parent_idcode_str, *Label, stmp[200];
01983 int *nPath0, *nPath1, N_n0, N_n1, i, niml_ROI_Datum_type;
01984 NI_element *nel ;
01985 NI_stream ns ;
01986 SUMA_NIML_DRAWN_ROI *niml_ROI = NULL;
01987
01988 idcode_str = (char*) malloc(sizeof(char) * 200); sprintf(idcode_str,"Moma- idcode_str");
01989 Parent_idcode_str = (char*) malloc(sizeof(char) * 200); sprintf(Parent_idcode_str,"El Parent");
01990 Label = (char*) malloc(sizeof(char) * 200); sprintf(Label,"Da laba");
01991 N_n0 = 3;
01992 N_n1 = 4;
01993 nPath0 = (int*) calloc(N_n0, sizeof(int));
01994 nPath1 = (int*) calloc(N_n1, sizeof(int));
01995 nPath0[0] = 2; nPath0[1] = 1; nPath0[2] = 10;
01996 nPath1[0] = 9; nPath1[1] = 7; nPath1[2] = 23; nPath1[3] = -3;
01997
01998 fprintf(stderr,"*********** Defining row type\n");
01999 niml_ROI_Datum_type = NI_rowtype_define("SUMA_NIML_ROI_DATUM", "int,int,int,int[#3]");
02000
02001 niml_ROI = (SUMA_NIML_DRAWN_ROI *)malloc(sizeof(SUMA_NIML_DRAWN_ROI));
02002 niml_ROI->Type = 4;
02003 niml_ROI->idcode_str = idcode_str;
02004 niml_ROI->Parent_idcode_str = Parent_idcode_str;
02005 niml_ROI->Label = Label;
02006 niml_ROI->iLabel = 20;
02007 niml_ROI->N_ROI_datum = 2;
02008 niml_ROI->ROI_datum = (SUMA_NIML_ROI_DATUM *)malloc(niml_ROI->N_ROI_datum*sizeof(SUMA_NIML_ROI_DATUM));
02009
02010 /* now fill the ROI_datum structures */
02011
02012 niml_ROI->ROI_datum[0].N_n = N_n0;
02013 niml_ROI->ROI_datum[1].N_n = N_n1;
02014 if (1) {
02015 fprintf(stderr,"*********** Filling ROI_datum structures\n");
02016 niml_ROI->ROI_datum[0].nPath = nPath0;
02017 niml_ROI->ROI_datum[1].nPath = nPath1;
02018 }else {
02019 fprintf(stderr,"*********** Skipping ROI_datum structure fill.\n");
02020 }
02021
02022 fprintf(stderr,"*********** Creating new data element, a column of %d elements \n", niml_ROI->N_ROI_datum);
02023 nel = NI_new_data_element("A_drawn_ROI", niml_ROI->N_ROI_datum);
02024
02025 fprintf(stderr,"*********** Adding column\n");
02026 NI_add_column( nel , niml_ROI_Datum_type, niml_ROI->ROI_datum );
02027
02028 fprintf(stderr,"*********** Setting attributes element\n");
02029 NI_set_attribute (nel, "Object_ID", niml_ROI->idcode_str);
02030 NI_set_attribute (nel, "Parent_ID", niml_ROI->Parent_idcode_str);
02031 NI_set_attribute (nel, "Label", niml_ROI->Label);
02032 sprintf(stmp,"%d", niml_ROI->iLabel);
02033 NI_set_attribute (nel, "iLabel", stmp);
02034 sprintf(stmp,"%d", niml_ROI->Type);
02035 NI_set_attribute (nel, "Type", stmp);
02036
02037 /* Now write the element */
02038 ns = NI_stream_open( "fd:1" , "w" ) ;
02039 if (NI_write_element( ns , nel , NI_TEXT_MODE | NI_HEADERSHARP_FLAG ) < 0) {
02040 fprintf(stderr,"*********** Badness, failed to write nel\n");
02041 }
02042 NI_stream_close( ns ) ;
02043
02044 /* free nel */
02045 NI_free_element(nel) ; nel = NULL;
02046
02047 /* free the rest */
02048 free(nPath0);
02049 free(nPath1);
02050 free(idcode_str);
02051 free(Parent_idcode_str);
02052 free(Label);
02053 }
02054
02055 }
|
|
|
Definition at line 2095 of file SUMA_niml.c. References SUMA_COMM_STRUCT::afni_host_name, SUMA_ENTRY, SUMA_free, SUMA_COMM_STRUCT::suma_host_name, and SUMA_RETURN. Referenced by SUMA_FreeGenericArgParse().
02096 {
02097 static char FuncName[]={"SUMA_Free_CommSrtuct"};
02098
02099 SUMA_ENTRY;
02100
02101 if (cs) {
02102 if (cs->suma_host_name) SUMA_free(cs->suma_host_name); cs->suma_host_name = NULL;
02103 if (cs->afni_host_name) SUMA_free(cs->afni_host_name); cs->afni_host_name = NULL;
02104 SUMA_free(cs);
02105 }
02106
02107 SUMA_RETURN(NULL);
02108 }
|
|
|
frees a nimlROI structure. These structures are created by the likes of SUMA_DrawnROI_to_NIMLDrawnROI
Definition at line 1878 of file SUMA_niml.c. References LocalHead, SUMA_NIML_DRAWN_ROI::ROI_datum, SUMA_Boolean, SUMA_ENTRY, SUMA_free, and SUMA_RETURN. Referenced by SUMA_OpenDrawnROI_NIML(), and SUMA_Write_DrawnROI_NIML().
01879 {
01880 static char FuncName[]={"SUMA_Free_NIMLDrawROI"};
01881 SUMA_Boolean LocalHead = NOPE;
01882
01883 SUMA_ENTRY;
01884
01885 if (!nimlROI) SUMA_RETURN(NULL);
01886
01887 if (nimlROI->ROI_datum) SUMA_free(nimlROI->ROI_datum); /* DO NOT FREE MEMORY POINTED to by fields inside nimlROI->ROI_datum */
01888 SUMA_free(nimlROI);
01889
01890 SUMA_RETURN(NULL);
01891 }
|
|
|
Definition at line 1420 of file SUMA_niml.c. References SUMA_CrossHair::c, SUMA_SurfaceViewer::Ch, SUMA_SurfaceViewer::Focus_SO_ID, NI_add_column(), NI_FLOAT, NI_new_data_element(), SUMA_SurfaceObject::SelectedNode, SUMA_calloc, SUMA_ENTRY, SUMA_free, SUMA_RETURN, SUMA_XYZ_XYZmap(), and SUMAg_N_DOv. Referenced by SUMA_Engine().
01421 {
01422 static char FuncName[]={"SUMA_makeNI_CrossHair"};
01423 NI_element *nel;
01424 float *XYZmap;
01425 int I_C = -1;
01426 SUMA_SurfaceObject *SO;
01427
01428 SUMA_ENTRY;
01429
01430 if (sv == NULL) {
01431 fprintf(SUMA_STDERR,"Error %s: Null sv.\n", FuncName);
01432 SUMA_RETURN (NULL);
01433 }
01434 if (sv->Ch == NULL) {
01435 fprintf(SUMA_STDERR,"Error %s: NULL Ch.\n", FuncName);
01436 SUMA_RETURN (NULL);
01437 }
01438
01439 SO = (SUMA_SurfaceObject *)(SUMAg_DOv[sv->Focus_SO_ID].OP);
01440 I_C = SO->SelectedNode;
01441 XYZmap = SUMA_XYZ_XYZmap (sv->Ch->c, SO, SUMAg_DOv, SUMAg_N_DOv, &I_C);
01442
01443 if (XYZmap == NULL){
01444 fprintf(SUMA_STDERR,"%s: Linkage is not posible, using current XYZ\n", FuncName);
01445 XYZmap = (float *)SUMA_calloc (3, sizeof(float));
01446 if (XYZmap == NULL) {
01447 fprintf (SUMA_STDERR, "Error %s: Give me a break !\n", FuncName);
01448 SUMA_RETURN (NULL);
01449 }
01450 XYZmap[0] = sv->Ch->c[0];
01451 XYZmap[1] = sv->Ch->c[1];
01452 XYZmap[2] = sv->Ch->c[2];
01453 }
01454
01455 /* make a new data element */
01456 nel = NI_new_data_element( "SUMA_crosshair_xyz" , 3) ;
01457
01458 if (!nel) {
01459 fprintf(SUMA_STDERR,"Error %s: Failed to allocate for nel\n", FuncName);
01460 SUMA_RETURN (NULL);
01461 }
01462
01463 NI_add_column( nel , NI_FLOAT , XYZmap );
01464
01465 if (XYZmap) SUMA_free(XYZmap);
01466
01467 SUMA_RETURN (nel);
01468 }
|
|
|
Make a NIML data element for a NI surface element IJK
Definition at line 1342 of file SUMA_niml.c. References SUMA_SurfaceObject::FaceSetDim, SUMA_SurfaceObject::FaceSetList, SUMA_SurfaceObject::idcode_str, SUMA_SurfaceObject::Label, SUMA_SurfaceObject::LocalDomainParent, SUMA_SurfaceObject::LocalDomainParentID, SUMA_SurfaceObject::N_FaceSet, NI_add_column(), NI_INT, NI_new_data_element(), NI_set_attribute(), SUMA_ENTRY, SUMA_free, SUMA_malloc, SUMA_RETURN, SUMA_VOLPAR::vol_idcode_str, and SUMA_SurfaceObject::VolPar. Referenced by SUMA_Engine().
01343 {
01344 static char FuncName[]={"SUMA_makeNI_SurfIJK"};
01345 NI_element *nel;
01346 int ii, ip, NP;
01347 int *I, *J, *K;
01348
01349 SUMA_ENTRY;
01350
01351
01352 if (SO == NULL) {
01353 fprintf(SUMA_STDERR,"Error %s: Null SO.\n", FuncName);
01354 SUMA_RETURN (NULL);
01355 }
01356 if (SO->N_FaceSet <= 0) {
01357 fprintf(SUMA_STDERR,"Error %s: No FaceSets in SO.\n", FuncName);
01358 SUMA_RETURN (NULL);
01359 }
01360
01361 NP = SO->FaceSetDim;
01362 /* make a new data element, to be filled by columns */
01363 nel = NI_new_data_element( "SUMA_ijk" , SO->N_FaceSet) ;
01364
01365 /* make the columns to be put in the element */
01366 I = (int *) SUMA_malloc( sizeof(int) * SO->N_FaceSet ) ;
01367 J = (int *) SUMA_malloc( sizeof(int) * SO->N_FaceSet ) ;
01368 K = (int *) SUMA_malloc( sizeof(int) * SO->N_FaceSet ) ;
01369
01370 if (!nel || !I || !J || !K ) {
01371 fprintf(SUMA_STDERR,"Error %s: Failed to allocate for nel, I, J or K.\n", FuncName);
01372 SUMA_RETURN (NULL);
01373 }
01374
01375
01376 /* load the columns from the struct array */
01377
01378 for( ii=0 ; ii < SO->N_FaceSet ; ii++ ){
01379 ip = NP * ii;
01380 I[ii] = SO->FaceSetList[ip];
01381 J[ii] = SO->FaceSetList[ip+1];
01382 K[ii] = SO->FaceSetList[ip+2];
01383 }
01384
01385 /* put columns into element */
01386
01387 NI_add_column( nel , NI_INT , I ) ; SUMA_free(I) ;
01388 NI_add_column( nel , NI_INT , J ) ; SUMA_free(J) ;
01389 NI_add_column( nel , NI_INT , K ) ; SUMA_free(K) ;
01390
01391 NI_set_attribute (nel, "volume_idcode", SO->VolPar->vol_idcode_str);
01392 NI_set_attribute (nel, "surface_idcode", SO->idcode_str);
01393 NI_set_attribute (nel, "surface_label", SO->Label);
01394 NI_set_attribute (nel, "local_domain_parent_ID", SO->LocalDomainParentID);
01395 NI_set_attribute (nel, "local_domain_parent", SO->LocalDomainParent);
01396
01397 SUMA_RETURN (nel);
01398 }
|
|
|
Make a NIML data element for a NI surface element i nx ny nz onde index followed by node normal
Definition at line 1267 of file SUMA_niml.c. References SUMA_SurfaceObject::idcode_str, SUMA_SurfaceObject::Label, SUMA_SurfaceObject::LocalDomainParent, SUMA_SurfaceObject::LocalDomainParentID, SUMA_SurfaceObject::N_Node, NI_add_column(), NI_FLOAT, NI_INT, NI_new_data_element(), NI_set_attribute(), SUMA_SurfaceObject::NodeDim, SUMA_SurfaceObject::NodeNormList, SUMA_ENTRY, SUMA_free, SUMA_malloc, SUMA_RETURN, SUMA_VOLPAR::vol_idcode_str, SUMA_SurfaceObject::VolPar, xc, and yc. Referenced by SUMA_Engine().
01268 {
01269 static char FuncName[]={"SUMA_makeNI_SurfINORM"};
01270 NI_element *nel=NULL;
01271 int *ic=NULL, ii, ND, id;
01272 float *xc=NULL, *yc=NULL, *zc=NULL;
01273
01274 SUMA_ENTRY;
01275
01276
01277 if (SO == NULL) {
01278 fprintf(SUMA_STDERR,"Error %s: Null SO.\n", FuncName);
01279 SUMA_RETURN (NULL);
01280 }
01281 if (SO->N_Node <= 0) {
01282 fprintf(SUMA_STDERR,"Error %s: No nodes in SO.\n", FuncName);
01283 SUMA_RETURN (NULL);
01284 }
01285 if (!SO->NodeNormList) {
01286 fprintf(SUMA_STDERR,"Error %s: No normals in SO.\n", FuncName);
01287 SUMA_RETURN (NULL);
01288 }
01289
01290 /* make a new data element, to be filled by columns */
01291 nel = NI_new_data_element( "SUMA_node_normals" , SO->N_Node) ;
01292
01293 /* make the columns to be put in the element */
01294 #ifdef DOINDEX
01295 ic = (int *) SUMA_malloc( sizeof(int) * SO->N_Node ) ;
01296 #endif
01297 xc = (float *) SUMA_malloc( sizeof(float) * SO->N_Node ) ;
01298 yc = (float *) SUMA_malloc( sizeof(float) * SO->N_Node ) ;
01299 zc = (float *) SUMA_malloc( sizeof(float) * SO->N_Node ) ;
01300
01301 if (!nel || !xc || !yc || !zc) {
01302 fprintf(SUMA_STDERR,"Error %s: Failed to allocate for nel, ic, xc, yc or zc.\n", FuncName);
01303 SUMA_RETURN (NULL);
01304 }
01305
01306
01307 /* load the columns from the struct array */
01308 ND = SO->NodeDim;
01309 for( ii=0 ; ii < SO->N_Node ; ii++ ){
01310 #ifdef DOINDEX
01311 ic[ii] = ii;
01312 #endif
01313 id = ND * ii;
01314 xc[ii] = SO->NodeNormList[id];
01315 yc[ii] = SO->NodeNormList[id+1];
01316 zc[ii] = SO->NodeNormList[id+2];
01317 }
01318
01319 /* put columns into element */
01320
01321 #ifdef DOINDEX
01322 NI_add_column( nel , NI_INT , ic ) ; SUMA_free(ic) ;
01323 #endif
01324 NI_add_column( nel , NI_FLOAT , xc ) ; SUMA_free(xc) ;
01325 NI_add_column( nel , NI_FLOAT , yc ) ; SUMA_free(yc) ;
01326 NI_add_column( nel , NI_FLOAT , zc ) ; SUMA_free(zc) ;
01327
01328 NI_set_attribute (nel, "volume_idcode", SO->VolPar->vol_idcode_str);
01329 NI_set_attribute (nel, "surface_idcode", SO->idcode_str);
01330 NI_set_attribute (nel, "surface_label", SO->Label);
01331 NI_set_attribute (nel, "local_domain_parent_ID", SO->LocalDomainParentID);
01332 NI_set_attribute (nel, "local_domain_parent", SO->LocalDomainParent);
01333 SUMA_RETURN (nel);
01334 }
|
|
|
Make a NIML data element for a NI surface element IXYZ
Definition at line 1201 of file SUMA_niml.c. References SUMA_SurfaceObject::idcode_str, SUMA_SurfaceObject::Label, SUMA_SurfaceObject::LocalDomainParent, SUMA_SurfaceObject::LocalDomainParentID, SUMA_SurfaceObject::N_Node, NI_add_column(), NI_FLOAT, NI_INT, NI_new_data_element(), NI_set_attribute(), SUMA_SurfaceObject::NodeDim, SUMA_SurfaceObject::NodeList, SUMA_ENTRY, SUMA_free, SUMA_malloc, SUMA_RETURN, SUMA_VOLPAR::vol_idcode_str, SUMA_SurfaceObject::VolPar, xc, and yc. Referenced by SUMA_Engine().
01202 {
01203 static char FuncName[]={"SUMA_makeNI_SurfIXYZ"};
01204 NI_element *nel;
01205 int *ic, ii, ND, id;
01206 float *xc, *yc, *zc;
01207
01208 SUMA_ENTRY;
01209
01210
01211 if (SO == NULL) {
01212 fprintf(SUMA_STDERR,"Error %s: Null SO.\n", FuncName);
01213 SUMA_RETURN (NULL);
01214 }
01215 if (SO->N_Node <= 0) {
01216 fprintf(SUMA_STDERR,"Error %s: No nodes in SO.\n", FuncName);
01217 SUMA_RETURN (NULL);
01218 }
01219
01220 /* make a new data element, to be filled by columns */
01221 nel = NI_new_data_element( "SUMA_ixyz" , SO->N_Node) ;
01222
01223 /* make the columns to be put in the element */
01224 ic = (int *) SUMA_malloc( sizeof(int) * SO->N_Node ) ;
01225 xc = (float *) SUMA_malloc( sizeof(float) * SO->N_Node ) ;
01226 yc = (float *) SUMA_malloc( sizeof(float) * SO->N_Node ) ;
01227 zc = (float *) SUMA_malloc( sizeof(float) * SO->N_Node ) ;
01228
01229 if (!nel || !ic || !xc || !yc || !zc) {
01230 fprintf(SUMA_STDERR,"Error %s: Failed to allocate for nel, ic, xc, yc or zc.\n", FuncName);
01231 SUMA_RETURN (NULL);
01232 }
01233
01234
01235 /* load the columns from the struct array */
01236 ND = SO->NodeDim;
01237 for( ii=0 ; ii < SO->N_Node ; ii++ ){
01238 ic[ii] = ii;
01239 id = ND * ii;
01240 xc[ii] = SO->NodeList[id];
01241 yc[ii] = SO->NodeList[id+1];
01242 zc[ii] = SO->NodeList[id+2];
01243 }
01244
01245 /* put columns into element */
01246
01247 NI_add_column( nel , NI_INT , ic ) ; SUMA_free(ic) ;
01248 NI_add_column( nel , NI_FLOAT , xc ) ; SUMA_free(xc) ;
01249 NI_add_column( nel , NI_FLOAT , yc ) ; SUMA_free(yc) ;
01250 NI_add_column( nel , NI_FLOAT , zc ) ; SUMA_free(zc) ;
01251
01252 if (SO->VolPar) NI_set_attribute (nel, "volume_idcode", SO->VolPar->vol_idcode_str);
01253 NI_set_attribute (nel, "surface_idcode", SO->idcode_str);
01254 NI_set_attribute (nel, "surface_label", SO->Label);
01255 NI_set_attribute (nel, "local_domain_parent_ID", SO->LocalDomainParentID);
01256 NI_set_attribute (nel, "local_domain_parent", SO->LocalDomainParent);
01257 SUMA_RETURN (nel);
01258 }
|
|
||||||||||||||||||||
|
A function to turn triangulation to nel to be sent to SUMA There's nothing to cleanup so worry not about making a cleanup call
Definition at line 2298 of file SUMA_niml.c. References cleanup(), SUMA_SurfaceObject::FaceSetDim, SUMA_SurfaceObject::facesetlist_idcode_str, SUMA_SurfaceObject::Group, SUMA_SurfaceObject::idcode_str, SUMA_SurfaceObject::Label, LocalHead, SUMA_SurfaceObject::N_FaceSet, SUMA_SurfaceObject::N_Node, NI_add_column_stride(), NI_INT, NI_set_attribute(), SUMA_SurfaceObject::State, SUMA_AddNelCol(), SUMA_allow_nel_use(), SUMA_Boolean, SUMA_DSET_TYPE, SUMA_EMPTY_ATTR, SUMA_ENTRY, SUMA_LH, SUMA_MESH_IJK, SUMA_NEW_MESH_IJK, SUMA_NewNel(), SUMA_NODE_INT, SUMA_RETURN, and SUMA_SL_Err. Referenced by SUMA_SendSumaNewSurface(), SUMA_SendToSuma(), and SUMA_SO2nimlSO().
02299 {
02300 static char FuncName[]={"SUMA_Mesh_IJK2Mesh_IJK_nel"};
02301 static int i_in=0;
02302 char buf[500];
02303 NI_element *nel=NULL;
02304 SUMA_Boolean LocalHead = NOPE;
02305
02306 SUMA_ENTRY;
02307
02308
02309 if (dtype != SUMA_NEW_MESH_IJK && dtype != SUMA_MESH_IJK) {
02310 SUMA_SL_Err("Bad dtype for this function!");
02311 SUMA_RETURN(NULL);
02312 }
02313
02314 if (cleanup) {
02315 SUMA_LH("Cleanup...");
02316 SUMA_RETURN(NULL);
02317 }
02318
02319 if (SO->FaceSetDim != 3) { /* only deals with XYZ for the moment */
02320 SUMA_SL_Err("FaceSetDim must be 3!");
02321 SUMA_RETURN(nel);
02322 }
02323
02324 if (!i_in) {
02325 /* Initialization block. Nothing to do , really */
02326 }
02327
02328
02329 /* Now create that data element and write it out */
02330 SUMA_allow_nel_use(1);
02331 nel = SUMA_NewNel ( dtype, /* one of SUMA_DSET_TYPE */
02332 SO->idcode_str, /* idcode of Domain Parent */
02333 NULL, /* idcode of geometry parent, not useful here*/
02334 3*SO->N_FaceSet,
02335 NULL,
02336 SO->facesetlist_idcode_str);
02337 if (!nel) {
02338 fprintf (stderr,"Error %s:\nFailed in SUMA_NewNel", FuncName);
02339 SUMA_RETURN(NULL);
02340 }
02341
02342 sprintf(buf, "%d", SO->FaceSetDim);
02343 NI_set_attribute (nel, "Mesh_Dim", buf);
02344
02345 /* set the label */
02346 if (SO->Label) {
02347 sprintf(buf, "FaceSetList for surface %s", SO->Label);
02348 NI_set_attribute (nel, "Object_Label", buf);
02349 } else {
02350 NI_set_attribute (nel, "Object_Label", SUMA_EMPTY_ATTR);
02351 }
02352
02353 #if 0 /* no longer needed */
02354 if (!SO->idcode_str) { SUMA_SL_Err("Surface has a NULL idcode_str, BAD.\n"); SUMA_RETURN(NULL);}
02355 NI_set_attribute (nel, "surface_idcode", SO->idcode_str);
02356
02357 if (!SO->Group) { SUMA_SL_Err("Surface has a NULL Group, BAD.\n"); SUMA_RETURN(NULL);}
02358 NI_set_attribute(nel, "Group", SO->Group);
02359 if (!SO->Label) { NI_set_attribute(nel, "Label", "Def_MeshIJK2MeshIJK_nel"); }
02360 else NI_set_attribute(nel, "Label", SO->Label);
02361 if (!SO->State) { SUMA_SL_Err("Surface has a NULL state, BAD.\n"); SUMA_RETURN(NULL);}
02362 NI_set_attribute(nel, "State", SO->State);
02363 sprintf(buf, "%d", SO->N_Node);
02364 NI_set_attribute(nel, "N_Node", buf);
02365 NI_set_attribute(nel, "EmbedDim", "3");
02366 NI_set_attribute(nel, "AnatCorrect", "1");
02367 #endif
02368
02369 #if 0 /* the old way, no need for embellishments */
02370 /* Add the coordinate column */
02371 if (!SUMA_AddNelCol (nel, /* the famed nel */
02372 "IJK indices",
02373 SUMA_NODE_INT, /* the column's type (description),
02374 one of SUMA_COL_TYPE */
02375 (void *)val, /* the coordinates */
02376 NULL /* that's an optional structure containing
02377 attributes of the added column.
02378 Not used at the moment */
02379 ,1
02380 )) {
02381 fprintf (stderr,"Error %s:\nFailed in SUMA_AddNelCol", FuncName);
02382 SUMA_RETURN(NULL);
02383 }
02384 #else
02385 NI_add_column_stride ( nel, NI_INT, val, 1 );
02386 #endif
02387
02388 ++i_in;
02389
02390 /* return the element */
02391 SUMA_RETURN(nel);
02392
02393 }
|
|
||||||||||||
|
Definition at line 2240 of file SUMA_niml.c. References SUMA_SurfaceObject::FaceSetDim, SUMA_SurfaceObject::FaceSetList, SUMA_SurfaceObject::facesetlist_idcode_str, SUMA_SurfaceObject::idcode_str, LocalHead, SUMA_SurfaceObject::N_FaceSet, NI_element::name, NI_get_attribute(), SUMA_Boolean, SUMA_copy_string(), SUMA_DSET_TYPE, SUMA_Dset_Type(), SUMA_ENTRY, SUMA_free, SUMA_IS_EMPTY_STR_ATTR, SUMA_malloc, SUMA_MESH_IJK, SUMA_NEW_MESH_IJK, SUMA_RETURN, SUMA_SL_Crit, SUMA_SL_Err, NI_element::vec, and NI_element::vec_len. Referenced by SUMA_nimlSO2SO().
02241 {
02242 static char FuncName[]={"SUMA_Mesh_IJK_nel2Mesh_IJK"};
02243 SUMA_DSET_TYPE dtype;
02244 char *tmp=NULL;
02245 SUMA_Boolean LocalHead = NOPE;
02246
02247 SUMA_ENTRY;
02248
02249 dtype = SUMA_Dset_Type(nel->name);
02250 if (dtype != SUMA_NEW_MESH_IJK && dtype != SUMA_MESH_IJK) {
02251 SUMA_SL_Err("Bad dtype for this function!");
02252 SUMA_RETURN(NOPE);
02253 }
02254
02255 tmp = NI_get_attribute(nel, "Parent_ID");
02256 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) {
02257 if (strcmp(SO->idcode_str, tmp)) {
02258 SUMA_SL_Err("idcode mismatch."); SUMA_RETURN(NOPE);
02259 }
02260 }
02261 tmp = NI_get_attribute(nel, "Object_ID");
02262 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) SO->facesetlist_idcode_str = SUMA_copy_string(tmp);
02263
02264 tmp = NI_get_attribute(nel, "Mesh_Dim");
02265 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) SO->FaceSetDim = atoi(tmp);
02266 else SO->FaceSetDim = 0;
02267
02268 if (SO->FaceSetDim != 3) {
02269 SUMA_SL_Err("FaceSetDim must be 3!"); SUMA_RETURN(NOPE);
02270 }
02271
02272 if (SO->N_FaceSet) {
02273 if (SO->N_FaceSet == nel->vec_len/SO->FaceSetDim ) {
02274 if (!SO->FaceSetList) {
02275 SUMA_SL_Err("Bad init variables. SO->N_FaceSet == nel->vec_len/SO->FaceSetDim && !SO->FaceSetList"); SUMA_RETURN(NOPE);
02276 }
02277 } else {
02278 if (SO->FaceSetList) SUMA_free(SO->FaceSetList); SO->FaceSetList = NULL;
02279 }
02280 } else {
02281 if (SO->FaceSetList) { SUMA_SL_Err("SO->FaceSetList should be null here!"); SUMA_RETURN(NOPE); }
02282 }
02283 SO->N_FaceSet = nel->vec_len/SO->FaceSetDim;
02284 if (!SO->FaceSetList) SO->FaceSetList = (int *)SUMA_malloc(nel->vec_len * sizeof(int));
02285 if (!SO->FaceSetList) {
02286 SUMA_SL_Crit("Failed to allocate for FaceSetList"); SUMA_RETURN(NOPE);
02287 }
02288 memcpy((void*)SO->FaceSetList, nel->vec[0], nel->vec_len*sizeof(int));
02289
02290 SUMA_RETURN(YUP);
02291 }
|
|
|
Definition at line 1400 of file SUMA_niml.c. References NI_stream_close(), NI_stream_open(), NI_TEXT_MODE, NI_write_element(), SUMA_Boolean, SUMA_ENTRY, and SUMA_RETURN. Referenced by SUMA_OpenDrawnROI_NIML(), SUMA_process_NIML_data(), and SUMA_Write_DrawnROI_NIML().
01401 {
01402 static char FuncName[]={"SUMA_nel_stdout"};
01403 NI_stream nstdout;
01404
01405 SUMA_ENTRY;
01406
01407 nstdout = NI_stream_open( "fd:1","w");
01408 if( nstdout == NULL ){
01409 fprintf(SUMA_STDERR,"%s: Can't open fd:1\n", FuncName);
01410 SUMA_RETURN(NOPE);
01411 }
01412 fprintf (stdout, "\n----------------------------nel stdout begin-------------------\n");
01413 NI_write_element( nstdout , nel , NI_TEXT_MODE ) ;
01414 fprintf (stdout, "----------------------------nel stdout end -------------------\n");
01415 NI_stream_close(nstdout);
01416
01417 SUMA_RETURN(YUP);
01418 }
|
|
||||||||||||||||
|
Initiates a call on stream cf->ns_v[si].
Definition at line 286 of file SUMA_niml.c. References SUMA_CommonFields::Connected_v, SUMA_CommonFields::HostName_v, LocalHead, NI_stream_open(), NI_stream_reopen(), NI_stream_writecheck(), SUMA_CommonFields::NimlStream_v, SUMA_CommonFields::ns_flags_v, SUMA_CommonFields::ns_v, SUMA_BEEP, SUMA_Boolean, SUMA_ENTRY, SUMA_FLAG_CONNECTED, SUMA_MAX_STREAMS, SUMA_RETURN, SUMA_SL_Err, SUMA_SLP_Err, SUMA_WriteCheckWait, SUMA_WriteCheckWaitMax, and SUMA_CommonFields::TrackingId_v. Referenced by SUMA_Engine(), SUMA_SendToAfni(), and SUMA_SendToSuma().
00287 {
00288 static char FuncName[]={"SUMA_niml_call"};
00289 int nn, Wait_tot;
00290 SUMA_Boolean LocalHead = NOPE;
00291
00292 SUMA_ENTRY;
00293
00294 if (si < 0 || si >= SUMA_MAX_STREAMS) {
00295 SUMA_SL_Err("Bad value for stream index.");
00296 SUMA_RETURN(NOPE);
00297 }
00298
00299 /* find out if the stream has been established already */
00300 if (cf->ns_v[si]) { /* stream is open, nothing to do */
00301 cf->ns_flags_v[si] = SUMA_FLAG_CONNECTED;
00302 if (LocalHead) fprintf(SUMA_STDOUT,"%s: Stream existed, reusing.\n", FuncName);
00303 fprintf(SUMA_STDOUT,"%s: Connected.\n", FuncName); fflush(SUMA_STDOUT);
00304 }else { /* must open stream */
00305 /* contact afni */
00306 fprintf(SUMA_STDOUT,"%s: Contacting ...\n", FuncName); fflush(SUMA_STDOUT);
00307 cf->ns_v[si] = NI_stream_open( cf->NimlStream_v[si] , "w" ) ;
00308 if (!cf->ns_v[si]) {
00309 cf->ns_flags_v[si] = 0;
00310 cf->TrackingId_v[si] = 0;
00311
00312 if (fromSUMA) { SUMA_SLP_Err("NI_stream_open failed (1p)."); }
00313 else { SUMA_SL_Err("NI_stream_open failed (1)."); }
00314 SUMA_BEEP;
00315 cf->Connected_v[si] = !cf->Connected_v[si];
00316 SUMA_RETURN(NOPE) ;
00317 }
00318 if (!strcmp(cf->HostName_v[si],"localhost")) { /* only try shared memory when
00319 AfniHostName is localhost */
00320 fprintf (SUMA_STDERR, "%s: Trying shared memory...\n", FuncName);
00321 if( strstr( cf->NimlStream_v[si] , "tcp:localhost:" ) != NULL ) {
00322 if (!NI_stream_reopen( cf->ns_v[si] , "shm:WeLikeElvis:1M" )) {
00323 fprintf (SUMA_STDERR, "Warning %s: Shared memory communcation failed.\n", FuncName);
00324 }
00325 }
00326 }
00327 /* cf->ns_v[si] = NI_stream_open( "tcp:128.231.212.194:53211" , "w" ) ;*/
00328
00329 if( cf->ns_v[si] == NULL ){
00330 if (fromSUMA) { SUMA_SLP_Err("NI_stream_open failed (2p)");}
00331 else { SUMA_SL_Err("NI_stream_open failed (2)");}
00332 SUMA_BEEP;
00333 cf->Connected_v[si] = !cf->Connected_v[si];
00334 cf->ns_flags_v[si] = 0;
00335 cf->TrackingId_v[si] = 0;
00336
00337 SUMA_RETURN(NOPE) ;
00338 }
00339
00340 Wait_tot = 0;
00341 while(Wait_tot < SUMA_WriteCheckWaitMax){
00342 nn = NI_stream_writecheck( cf->ns_v[si] , SUMA_WriteCheckWait) ;
00343 if( nn == 1 ){
00344 fprintf(stderr,"\n") ;
00345 cf->ns_flags_v[si] = SUMA_FLAG_CONNECTED;
00346 SUMA_RETURN(YUP) ;
00347 }
00348 if( nn < 0 ){
00349 fprintf(stderr,"BAD\n");
00350 cf->Connected_v[si] = !cf->Connected_v[si];
00351 cf->ns_v[si] = NULL;
00352 cf->ns_flags_v[si] = 0;
00353 cf->TrackingId_v[si] = 0;
00354 SUMA_RETURN(NOPE);
00355 }
00356 Wait_tot += SUMA_WriteCheckWait;
00357 fprintf(SUMA_STDERR,".") ;
00358 }
00359
00360 /* make sure you did not exit because of time out */
00361 if (nn!=1) {
00362 cf->Connected_v[si] = !cf->Connected_v[si];
00363 cf->ns_v[si] = NULL;
00364 cf->ns_flags_v[si] = 0;
00365 cf->TrackingId_v[si] = 0;
00366 fprintf(SUMA_STDERR,"Error %s: WriteCheck timed out (> %d ms).\n", FuncName, SUMA_WriteCheckWaitMax);
00367 SUMA_RETURN(NOPE);
00368 }
00369 }
00370
00371 /* Stream is open */
00372 SUMA_RETURN(YUP);
00373 }
|
|
||||||||||||||||||||
|
Definition at line 232 of file SUMA_niml.c. References SUMA_CommonFields::Connected_v, i, LocalHead, NI_stream_close(), NI_stream_kill(), SUMA_CommonFields::ns_flags_v, SUMA_CommonFields::ns_v, SUMA_Boolean, SUMA_ENTRY, SUMA_LH, SUMA_RETURN, SUMA_SL_Err, SUMA_SLP_Err, SUMA_which_stream_index(), and SUMA_CommonFields::TrackingId_v. Referenced by SUMA_process_NIML_data().
00233 {
00234 static char FuncName[]={"SUMA_niml_hangup"};
00235 int i;
00236 SUMA_Boolean LocalHead = NOPE;
00237
00238 SUMA_ENTRY;
00239
00240 if (!nel_stream_name) {
00241 if (!fromSUMA) { SUMA_SL_Err("NULL stream name"); }
00242 else { SUMA_SLP_Err("NULL stream name"); }
00243 SUMA_RETURN(NOPE);
00244 }
00245
00246
00247 i = SUMA_which_stream_index (cf, nel_stream_name);
00248
00249
00250 if (i < 0) {
00251 if (!fromSUMA) { SUMA_SL_Err("Stream not found"); }
00252 else { SUMA_SLP_Err("Stream not found"); }
00253 SUMA_RETURN(NOPE);
00254 } else {
00255 SUMA_LH("Stream found.");
00256 fprintf (SUMA_STDERR,"%s: stream index %d\n", FuncName, i);
00257 if (killit) {
00258 SUMA_LH("Killing stream");
00259 NI_stream_kill(cf->ns_v[i]);
00260 }else {
00261 SUMA_LH("Just closing stream");
00262 NI_stream_close(cf->ns_v[i]);
00263 }
00264 cf->ns_v[i] = NULL;
00265 cf->Connected_v[i] = NOPE;
00266 cf->ns_flags_v[i] = 0;
00267 cf->TrackingId_v[i] = 0;
00268 }
00269
00270 SUMA_RETURN(YUP);
00271 }
|
|
|
NIML workprocess.
Definition at line 27 of file SUMA_niml.c. References SUMA_CommonFields::Listening, LocalHead, NI_element::name, NI_clock_time(), NI_free_element(), NI_get_attribute(), NI_read_element(), NI_stream_close(), NI_stream_goodcheck(), NI_stream_hasinput(), NI_stream_name(), NI_stream_open(), NI_stream_readcheck(), SUMA_CommonFields::niml_work_on, SUMA_CommonFields::NimlStream_v, SUMA_CommonFields::ns_flags_v, SUMA_CommonFields::ns_v, SE_CloseStream4All, SEF_i, SEI_Head, SES_Suma, SUMA_AFNI_STREAM_INDEX, SUMA_AFNI_STREAM_INDEX2, SUMA_BEEP, SUMA_Boolean, SUMA_CreateList(), SUMA_Engine(), SUMA_ENTRY, SUMA_FLAG_CONNECTED, SUMA_FLAG_SKIP, SUMA_FLAG_WAITING, SUMA_InitializeEngineListData(), SUMA_LH, SUMA_MAX_STREAMS, SUMA_process_NIML_data(), SUMA_RegisterEngineListCommand(), SUMA_RETURN, SUMA_CommonFields::TrackingId_v, NI_element::vec, NI_element::vec_filled, NI_element::vec_len, and NI_element::vec_num.
00028 {
00029 static char FuncName[]={"SUMA_niml_workproc"};
00030 int cc , nn, ngood = 0, id;
00031 void *nini ;
00032 char tmpcom[100], *nel_track;
00033 SUMA_SurfaceViewer *sv;
00034 NI_element *nel ;
00035 DList *list = NULL;
00036 SUMA_EngineData *ED = NULL;
00037 SUMA_Boolean LocalHead = NOPE;
00038
00039 if (SUMA_NIML_WORKPROC_IO_NOTIFY) {SUMA_ENTRY;}
00040
00041 if (!SUMAg_CF->niml_work_on) SUMAg_CF->niml_work_on = YUP;
00042
00043 sv = (SUMA_SurfaceViewer *)thereiselvis;
00044 SUMA_LH("In");
00045
00046 for (cc=0; cc<SUMA_MAX_STREAMS; ++cc) {
00047 if (cc == SUMA_AFNI_STREAM_INDEX2) continue; /* this stream is listened to by AFNI and is used by non-suma
00048 SUMA programs to communicate with AFNI directly. SUMA programs are not
00049 to receive elements back on this stream (unlike suma with SUMA_AFNI_STREAM_INDEX)
00050 because communications for now are one way only. */
00051 #if 0
00052 /* *** Pre Dec. 18 03, only SUMA talked to AFNI */
00053 /* check if stream is open */
00054
00055 if( SUMAg_CF->ns == NULL ){
00056 fprintf(SUMA_STDERR,"Error SUMA_niml_workproc: Stream is not open. \n");
00057 if (SUMA_NIML_WORKPROC_IO_NOTIFY) {
00058 SUMA_RETURN(True); /* Don't call me with that lousy stream again */
00059 }
00060 else return (True); /* to reduce the massive amounts of tracing messages */
00061 }
00062 #else
00063 /* *** post Dec. 18 03, making SUMA listen to people's needs */
00064 /* open streams that aren't open */
00065
00066
00067 if (cc != SUMA_AFNI_STREAM_INDEX && cc != SUMA_AFNI_STREAM_INDEX2) { /* Leave AFNI's stream alone, SUMA initiates the connection here,
00068 SUMA_AFNI_STREAM_INDEX2 is not needed here because of earlier
00069 condition, but it is left here as a reminder.*/
00070
00071 if (LocalHead) fprintf (SUMA_STDERR, "%s: Checking on stream %d, %s\n", FuncName, cc, SUMAg_CF->NimlStream_v[cc]);
00072 if( SUMAg_CF->ns_v[cc] == NULL && (SUMAg_CF->ns_flags_v[cc] & SUMA_FLAG_SKIP)==0 ){
00073 if (LocalHead) fprintf (SUMA_STDERR, "%s: \tNot Skipped.\n", FuncName);
00074 SUMAg_CF->ns_v[cc] = NI_stream_open( SUMAg_CF->NimlStream_v[cc] , "r" ) ;
00075 if( SUMAg_CF->ns_v[cc] == NULL ){
00076 fprintf (SUMA_STDERR, "%s: Stream %d, %s open returned NULL\n", FuncName, cc, SUMAg_CF->NimlStream_v[cc]);
00077 SUMAg_CF->ns_flags_v[cc] = SUMA_FLAG_SKIP ; continue;
00078 }
00079 if (LocalHead) fprintf (SUMA_STDERR, "%s: Stream %d, %s open returned NOT null\n", FuncName, cc, SUMAg_CF->NimlStream_v[cc]);
00080 SUMAg_CF->ns_flags_v[cc] = SUMA_FLAG_WAITING ;
00081 }else {
00082 if (SUMAg_CF->ns_v[cc] == NULL) {
00083 SUMA_LH("\tSkipped");
00084 continue;
00085 }
00086 }
00087
00088 ngood ++;
00089 } else {
00090 if( SUMAg_CF->ns_v[SUMA_AFNI_STREAM_INDEX] ) {
00091 ngood ++;
00092 } else { /* do nothing for that stream */
00093 continue;
00094 }
00095 }
00096 #endif
00097
00098 /* check if stream has gone bad */
00099 nn = NI_stream_goodcheck( SUMAg_CF->ns_v[cc] , 1 ) ;
00100
00101 if( nn < 0 ){ /* is bad */
00102 NI_stream_close( SUMAg_CF->ns_v[cc] ) ;
00103 SUMAg_CF->ns_v[cc] = NULL ; /* this will get checked next time */
00104 fprintf(SUMA_STDERR,"Error SUMA_niml_workproc: Stream %d gone bad. Stream closed. \n", cc);
00105
00106 /* close everything */
00107 if (!list) list = SUMA_CreateList();
00108 ED = SUMA_InitializeEngineListData(SE_CloseStream4All);
00109 if (!SUMA_RegisterEngineListCommand ( list, ED,
00110 SEF_i, (void*)&cc,
00111 SES_Suma, (void *)sv, NOPE,
00112 SEI_Head, NULL)) {
00113 fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);
00114 }
00115
00116 if (!SUMA_Engine (&list)) {
00117 fprintf (SUMA_STDERR,"Error %s: Failed in SUMA_Engine.\n\a", FuncName);
00118 }
00119
00120 continue; /* skip to next stream */
00121 }
00122
00123 if (nn == 0) { /* waiting, come back later */
00124 continue;
00125 }
00126
00127 /* if here, stream is good;
00128 see if there is any data to be read */
00129
00130 if (SUMAg_CF->ns_flags_v[cc] & SUMA_FLAG_WAITING) {
00131 SUMAg_CF->ns_flags_v[cc] = SUMA_FLAG_CONNECTED;
00132 fprintf(SUMA_STDERR, "%s: ++ NIML connection opened from %s\n",
00133 FuncName, NI_stream_name(SUMAg_CF->ns_v[cc]) ) ;
00134 }
00135 #if 0
00136 /* not good enough, checks socket only, not buffer */
00137 nn = NI_stream_readcheck( SUMAg_CF->ns , 1 ) ;
00138 #else
00139 nn = NI_stream_hasinput( SUMAg_CF->ns_v[cc] , 1 ) ;
00140 #endif
00141
00142 if( nn > 0 ){ /* has data */
00143 int ct = NI_clock_time() ;
00144 if (LocalHead) fprintf(SUMA_STDERR,"%s: reading data stream", FuncName) ;
00145
00146 nini = NI_read_element( SUMAg_CF->ns_v[cc] , 1 ) ; /* read it */
00147 #if SUMA_SUMA_NIML_DEBUG /* debugging corruption of niml ...*/
00148 nel = (NI_element *)nini ;
00149 if( strcmp(nel->name,"SUMA_irgba") == 0 || strcmp(nel->name,"Node_RGBAb") == 0)
00150 {
00151 int *ibad=NULL;
00152
00153 ibad = (int *)nel->vec[0];
00154 if (ibad[0] > 1000) {
00155 fprintf (SUMA_STDERR,"**********\n\tibad[0] = %d\n****************\n", ibad[0]);
00156 fprintf (SUMA_STDOUT,"********** ibad[0] = %d ****************", ibad[0]);
00157 }
00158 if( nel->vec_len < 1 || nel->vec_filled < 1) { /* empty element? */
00159 fprintf(SUMA_STDERR,"--------\n\tEmpty SUMA_irgba (len = %d, len = %d)\n--------\n",
00160 nel->vec_len, nel->vec_filled);
00161 fprintf(SUMA_STDOUT,"-------- Empty SUMA_irgba (len = %d, filled = %d) --------",
00162 nel->vec_len, nel->vec_filled);
00163 }
00164 fprintf (SUMA_STDOUT,"\n");
00165 }
00166 #endif
00167
00168 if (LocalHead) fprintf(SUMA_STDERR," time=%d ms\n",NI_clock_time()-ct) ; ct = NI_clock_time() ;
00169
00170 if( nini != NULL ) {
00171 nel = (NI_element *)nini ;
00172 if (SUMAg_CF->TrackingId_v[cc]) {
00173 nel_track = NI_get_attribute(nel,"Tracking_ID");
00174 if (nel_track) {
00175 id = atoi(nel_track);
00176 if (id != SUMAg_CF->TrackingId_v[cc] + 1) {
00177 /* remember, "StartTracking" nel is the #1 element, first data element starts at 2 */
00178 fprintf (SUMA_STDERR,"Warning %s:\n Expected element %d, received element %d.\n",
00179 FuncName, SUMAg_CF->TrackingId_v[cc] + 1 , id );
00180 SUMA_BEEP;
00181 }
00182 SUMAg_CF->TrackingId_v[cc] = id;
00183 }
00184 }
00185 if (LocalHead) {
00186 fprintf(SUMA_STDERR,"%s: name=%s vec_len=%d vec_filled=%d, vec_num=%d\n", FuncName,\
00187 nel->name, nel->vec_len, nel->vec_filled, nel->vec_num );
00188 }
00189 if (!SUMA_process_NIML_data( nini , sv)) {
00190 fprintf(SUMA_STDERR,"Error %s: Failed in SUMA_process_NIML_data.\n", FuncName);
00191 }
00192 }
00193
00194 NI_free_element( nini ) ;
00195
00196 if (LocalHead) fprintf(SUMA_STDERR,"processing time=%d ms\n",NI_clock_time()-ct) ;
00197
00198 }
00199
00200 }/* for cc*/
00201
00202 if (ngood == 0) {
00203 SUMAg_CF->niml_work_on = NOPE;
00204 SUMAg_CF->Listening = NOPE;
00205 if (SUMA_NIML_WORKPROC_IO_NOTIFY) {
00206 SUMA_RETURN(True) ; /* don't call me back */
00207 }
00208 else return (True);
00209 }
00210
00211 if (SUMA_NIML_WORKPROC_IO_NOTIFY) {
00212 SUMA_RETURN(False) ; /* call me back baby*/
00213 }
00214 else return (False);
00215 }
|
|
||||||||||||
|
transfroms a SUMA_NIML_DRAWN_ROI * to a SUMA_DRAWN_ROI *
Definition at line 1763 of file SUMA_niml.c. References SUMA_ROI_DATUM::action, SUMA_DRAWN_ROI::ActionStack, SUMA_DRAWN_ROI::CE, SUMA_DRAWN_ROI::ColPlaneName, SUMA_NIML_DRAWN_ROI::ColPlaneName, dlist_init(), dlist_ins_next(), dlist_tail, SUMA_ROI_ACTION_STRUCT::DrawnROI, SUMA_DRAWN_ROI::DrawStatus, SUMA_DRAWN_ROI::EdgeColor, SUMA_NIML_DRAWN_ROI::EdgeColor, SUMA_DRAWN_ROI::EdgeThickness, SUMA_NIML_DRAWN_ROI::EdgeThickness, SUMA_DRAWN_ROI::FillColor, SUMA_NIML_DRAWN_ROI::FillColor, i, SUMA_DRAWN_ROI::idcode_str, SUMA_NIML_DRAWN_ROI::idcode_str, SUMA_DRAWN_ROI::iLabel, SUMA_NIML_DRAWN_ROI::iLabel, SUMA_DRAWN_ROI::Label, SUMA_NIML_DRAWN_ROI::Label, LocalHead, SUMA_DRAWN_ROI::N_CE, SUMA_ROI_DATUM::N_n, SUMA_NIML_DRAWN_ROI::N_ROI_datum, SUMA_ROI_DATUM::nPath, SUMA_DRAWN_ROI::Parent_idcode_str, SUMA_NIML_DRAWN_ROI::Parent_idcode_str, SUMA_NIML_DRAWN_ROI::ROI_datum, SUMA_ROI_ACTION_STRUCT::ROId, SUMA_DRAWN_ROI::ROIstrokelist, SUMA_DRAWN_ROI::StackPos, SUMA_AllocROIDatum(), SUMA_Boolean, SUMA_BSA_AppendStroke, SUMA_BSA_FillArea, SUMA_BSA_JoinEnds, SUMA_copy_string(), SUMA_CreateActionStack(), SUMA_ENTRY, SUMA_LH, SUMA_malloc, SUMA_PushActionStack(), SUMA_RETURN, SUMA_ROI_ClosedPath, SUMA_ROI_FilledArea, SUMA_ROI_Finished, SUMA_ROI_OpenPath, SUMA_SL_Err, SUMA_NIML_DRAWN_ROI::Type, SUMA_DRAWN_ROI::Type, and SUMA_ROI_DATUM::Type. Referenced by SUMA_OpenDrawnROI_NIML().
01764 {
01765 static char FuncName[]={"SUMA_NIMLDrawnROI_to_DrawnROI"};
01766 SUMA_ROI_ACTION_STRUCT *ROIA=NULL;
01767 SUMA_DRAWN_ROI *ROI = NULL;
01768 SUMA_ROI_DATUM *ROI_Datum = NULL;
01769 DListElmt *tmpStackPos=NULL;
01770 int i;
01771 SUMA_Boolean LocalHead = NOPE;
01772
01773 SUMA_ENTRY;
01774
01775 if (!nimlROI) SUMA_RETURN(NULL);
01776
01777 /* allocate and initialize the whimpy fields
01778 Based on SUMA_AllocateDrawnROI*/
01779 ROI = (SUMA_DRAWN_ROI *) SUMA_malloc(sizeof(SUMA_DRAWN_ROI));
01780 if ( nimlROI->Type == SUMA_ROI_OpenPath ||
01781 nimlROI->Type == SUMA_ROI_ClosedPath ||
01782 nimlROI->Type == SUMA_ROI_FilledArea ) { /* this ROI will gradually be reconstructed,
01783 start with the basics */
01784 ROI->Type = SUMA_ROI_OpenPath; /* at the end of the construction you should reach nimlROI->Type */
01785 }else {
01786 /* nothing to reconstruct */
01787 ROI->Type = nimlROI->Type;
01788 }
01789
01790 ROI->idcode_str = SUMA_copy_string(nimlROI->idcode_str);
01791 ROI->Parent_idcode_str = SUMA_copy_string(nimlROI->Parent_idcode_str);
01792 ROI->Label = SUMA_copy_string(nimlROI->Label);
01793 ROI->iLabel = nimlROI->iLabel;
01794 if (LocalHead) fprintf (SUMA_STDERR, "%s: ROI->Parent_idcode_str %s\n", FuncName, ROI->Parent_idcode_str);
01795
01796 ROI->ROIstrokelist = (DList *)SUMA_malloc (sizeof(DList));
01797 dlist_init(ROI->ROIstrokelist, SUMA_FreeROIDatum);
01798
01799 ROI->DrawStatus = SUMA_ROI_Finished;
01800 ROI->StackPos = NULL;
01801 ROI->ActionStack = SUMA_CreateActionStack ();
01802 ROI->ColPlaneName = SUMA_copy_string(nimlROI->ColPlaneName);
01803 ROI->FillColor[0] = nimlROI->FillColor[0];
01804 ROI->FillColor[1] = nimlROI->FillColor[1];
01805 ROI->FillColor[2] = nimlROI->FillColor[2];
01806 ROI->EdgeColor[0] = nimlROI->EdgeColor[0];
01807 ROI->EdgeColor[1] = nimlROI->EdgeColor[1];
01808 ROI->EdgeColor[2] = nimlROI->EdgeColor[2];
01809 ROI->EdgeThickness = nimlROI->EdgeThickness;
01810 ROI->CE = NULL;
01811 ROI->N_CE = -1;
01812 /* fill in the ROI datum stuff */
01813 for (i=0; i<nimlROI->N_ROI_datum; ++i) {
01814 ROI_Datum = SUMA_AllocROIDatum ();
01815 ROI_Datum->action = nimlROI->ROI_datum[i].action;
01816 ROI_Datum->nPath = nimlROI->ROI_datum[i].nPath;
01817 ROI_Datum->Type = nimlROI->ROI_datum[i].Type;
01818 ROI_Datum->N_n = nimlROI->ROI_datum[i].N_n;
01819 if (ForDisplay) { /* create DO/UNDO stack */
01820 ROIA = (SUMA_ROI_ACTION_STRUCT *) SUMA_malloc (sizeof(SUMA_ROI_ACTION_STRUCT));
01821 ROIA->DrawnROI = ROI;
01822 ROIA->ROId = ROI_Datum;
01823 switch (ROI_Datum->action) {
01824 case SUMA_BSA_AppendStroke:
01825 SUMA_LH("Appending Stroke Action");
01826 tmpStackPos = SUMA_PushActionStack (ROI->ActionStack, ROI->StackPos,
01827 SUMA_AddToTailROIDatum, (void *)ROIA, SUMA_DestroyROIActionData);
01828 break;
01829 case SUMA_BSA_JoinEnds:
01830 SUMA_LH("Join Ends Action");
01831 tmpStackPos = SUMA_PushActionStack (ROI->ActionStack, ROI->StackPos,
01832 SUMA_AddToTailJunctionROIDatum, (void *)ROIA, SUMA_DestroyROIActionData);
01833 break;
01834 case SUMA_BSA_FillArea:
01835 SUMA_LH("Fill Area Action");
01836 tmpStackPos = SUMA_PushActionStack (ROI->ActionStack, ROI->StackPos,
01837 SUMA_AddFillROIDatum, (void *)ROIA, SUMA_DestroyROIActionData);
01838 break;
01839 default:
01840 fprintf (SUMA_STDERR, "Error %s: Not ready to deal with this action (%d).\n",
01841 FuncName, ROI_Datum->action);
01842 break;
01843
01844 }
01845
01846 if (tmpStackPos) ROI->StackPos = tmpStackPos;
01847 else {
01848 fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_PushActionStack.\n", FuncName);
01849 }
01850 } else {
01851 /* ROI will not be used for display purposes, just add datum */
01852 dlist_ins_next(ROI->ROIstrokelist, dlist_tail(ROI->ROIstrokelist), (void *)ROI_Datum);
01853 }
01854 }
01855
01856 if (ForDisplay) {
01857 /* Saved ROIs are considered finished, put a finish action on the top of the action stack */
01858 ROIA = (SUMA_ROI_ACTION_STRUCT *) SUMA_malloc (sizeof(SUMA_ROI_ACTION_STRUCT));
01859 ROIA->DrawnROI = ROI;
01860 ROIA->ROId = NULL;
01861 tmpStackPos = SUMA_PushActionStack (ROI->ActionStack, ROI->StackPos,
01862 SUMA_FinishedROI, (void *)ROIA, SUMA_DestroyROIActionData);
01863 if (tmpStackPos) ROI->StackPos = tmpStackPos;
01864 else {
01865 SUMA_SL_Err("Failed in SUMA_PushActionStack.\n");
01866 SUMA_RETURN(NULL);
01867 }
01868 }
01869 SUMA_RETURN(ROI);
01870 }
|
|
||||||||||||||||||||
|
A function to turn node values into a colored nel to be sent to SUMA
Definition at line 2817 of file SUMA_niml.c. References SUMA_SCALE_TO_MAP_OPT::ApplyClip, SUMA_SCALE_TO_MAP_OPT::BrightFact, cleanup(), SUMA_COLOR_SCALED_VECT::cV, i, SUMA_SurfaceObject::idcode_str, SUMA_SCALE_TO_MAP_OPT::IntRange, LocalHead, SUMA_SCALE_TO_MAP_OPT::MaskZero, SUMA_SurfaceObject::N_Node, NI_set_attribute(), SUMA_AddNelCol(), SUMA_allow_nel_use(), SUMA_Boolean, SUMA_CMAP_MATLAB_DEF_BYR64, SUMA_Create_ColorScaledVect(), SUMA_ENTRY, SUMA_free, SUMA_GetStandardMap(), SUMA_LH, SUMA_malloc, SUMA_NewNel(), SUMA_NODE_Ab, SUMA_NODE_Bb, SUMA_NODE_Gb, SUMA_NODE_INDEX, SUMA_NODE_Rb, SUMA_NODE_RGBAb, SUMA_NODEVAL2IRGBA_CLEANUP, SUMA_PercRange(), SUMA_RETURN, SUMA_ScaleToMap(), SUMA_ScaleToMapOptInit(), SUMA_SL_Err, SUMA_STANDARD_CMAP, and UNIQ_idcode_fill(). Referenced by SUMA_SendToSuma().
02818 {
02819 static char FuncName[]={"SUMA_NodeVal2irgba_nel"};
02820 static int i_in=0, *node=NULL;
02821 static SUMA_COLOR_MAP *CM=NULL;
02822 static SUMA_SCALE_TO_MAP_OPT * OptScl=NULL;
02823 static SUMA_STANDARD_CMAP MapType;
02824 static SUMA_COLOR_SCALED_VECT * SV=NULL;
02825 static byte *rgba=NULL;
02826 static char past_instance[50]={""};
02827 char idcode_str[50];
02828 NI_element *nel=NULL;
02829 int i, i4, i3;
02830 float IntRange[2], *Vsort= NULL;
02831 SUMA_Boolean LocalHead = NOPE;
02832
02833 SUMA_ENTRY;
02834
02835 if (cleanup == 1) {
02836 SUMA_LH("Cleanup...");
02837 SUMA_NODEVAL2IRGBA_CLEANUP;
02838 past_instance[0]='\0';
02839 i_in = 0;
02840 SUMA_RETURN(NULL);
02841 }
02842
02843 if (!instanceID) {
02844 SUMA_SL_Err("This function requires instanceID to be non-null.");
02845 SUMA_RETURN(NULL);
02846 }
02847
02848 if (strcmp(instanceID, past_instance)) {
02849 SUMA_LH("A new instance");
02850 /* clean up if necessary */
02851 if (i_in) SUMA_NODEVAL2IRGBA_CLEANUP;
02852 i_in = 0;
02853 sprintf(past_instance,"%s", instanceID);
02854 }
02855
02856
02857
02858 if (!i_in) {
02859 /* first time around */
02860 /* create the color mapping of Cx (SUMA_CMAP_MATLAB_DEF_BYR64)*/
02861 CM = SUMA_GetStandardMap (SUMA_CMAP_MATLAB_DEF_BYR64);
02862 if (CM == NULL) {
02863 fprintf (SUMA_STDERR,"Error %s: Could not get standard colormap.\n", FuncName);
02864 SUMA_RETURN (NULL);
02865 }
02866
02867 /* get the options for creating the scaled color mapping */
02868 OptScl = SUMA_ScaleToMapOptInit();
02869 if (!OptScl) {
02870 fprintf (SUMA_STDERR,"Error %s: Could not get scaling option structure.\n", FuncName);
02871 SUMA_RETURN (NULL);
02872 }
02873
02874 /* work the options a bit */
02875 OptScl->ApplyClip = NOPE;
02876 OptScl->MaskZero = NOPE;
02877 IntRange[0] = 0; IntRange[1] = 100; /* percentile clipping range*/
02878 Vsort = SUMA_PercRange (val, NULL, SO->N_Node, IntRange, IntRange, NULL);
02879 if (Vsort[0] < 0 && Vsort[SO->N_Node -1] > 0 ) {
02880 /* the new method */
02881 if (fabs(IntRange[0]) > IntRange[1]) {
02882 IntRange[1] = -IntRange[0];
02883 } else {
02884 IntRange[0] = -IntRange[1];
02885 }
02886 }
02887 OptScl->IntRange[0] = IntRange[0]; OptScl->IntRange[1] = IntRange[1];
02888 OptScl->BrightFact = 1.0;
02889
02890 /* create structure to hold the colored values */
02891 SV = SUMA_Create_ColorScaledVect(SO->N_Node);/* allocate space for the result */
02892 if (!SV) {
02893 fprintf (SUMA_STDERR,"Error %s: Could not allocate for SV.\n", FuncName);
02894 SUMA_RETURN (NULL);
02895 }
02896
02897 /* node vector */
02898 node = (int *) SUMA_malloc(sizeof(int) * SO->N_Node);
02899 /* color vectors to hold RGBA colors*/
02900 rgba = (byte *) SUMA_malloc(sizeof(byte) * SO->N_Node * 4);
02901 if (!node || !rgba) {
02902 SUMA_SL_Err("Failed to allocate for node or rgba.");
02903 SUMA_RETURN(NULL);
02904 }
02905 for (i=0; i < SO->N_Node; ++i) node[i] = i;
02906
02907 if (Vsort) SUMA_free(Vsort); Vsort = NULL;
02908 }
02909
02910 /* map the values in val to the colormap */
02911
02912 /* finally ! */
02913 if (!SUMA_ScaleToMap (val, SO->N_Node, OptScl->IntRange[0], OptScl->IntRange[1], CM, OptScl, SV)) {
02914 fprintf (SUMA_STDERR,"Error %s: Failed in SUMA_ScaleToMap.\n", FuncName);
02915 SUMA_RETURN (NOPE);
02916 }
02917
02918 /* copy the colors to rgba */
02919 for (i=0; i < SO->N_Node; ++i) {
02920 i4 = 4 * i;
02921 i3 = 3 *i;
02922 rgba[i4] = (byte)(SV->cV[i3 ] * 255); ++i4;
02923 rgba[i4] = (byte)(SV->cV[i3+1] * 255); ++i4;
02924 rgba[i4] = (byte)(SV->cV[i3+2] * 255); ++i4;
02925 rgba[i4] = 255;
02926 }
02927
02928 /* now create the niml element */
02929 UNIQ_idcode_fill (idcode_str);
02930 /* Now create that data element and write it out */
02931 SUMA_allow_nel_use(1);
02932 nel = SUMA_NewNel ( SUMA_NODE_RGBAb, /* one of SUMA_DSET_TYPE */
02933 SO->idcode_str, /* idcode of Domain Parent */
02934 NULL, /* idcode of geometry parent, not useful here*/
02935 SO->N_Node,/* Number of elements */
02936 NULL, NULL);
02937 if (!nel) {
02938 fprintf (stderr,"Error %s:\nFailed in SUMA_NewNel", FuncName);
02939 SUMA_RETURN(NULL);
02940 }
02941 /* set the surface idcode attribute */
02942 NI_set_attribute (nel, "surface_idcode", SO->idcode_str);
02943
02944 /* Add the columns */
02945 SUMA_allow_nel_use(1);
02946 if (!SUMA_AddNelCol (nel, /* the famed nel */
02947 "node index",
02948 SUMA_NODE_INDEX, /* the column's type (description),
02949 one of SUMA_COL_TYPE */
02950 (void *)node, /* the list of node indices */
02951 NULL /* that's an optional structure containing
02952 attributes of the added column.
02953 Not used at the moment */
02954 ,1 /* stride, useful when you need to copy a column
02955 from a multiplexed vector. Say you have in p
02956 [rgb rgb rgb rgb], to get the g column you
02957 send in p+1 for the column pointer and a stride
02958 of 3 */
02959 )) {
02960 fprintf (stderr,"Error %s:\nFailed in SUMA_AddNelCol", FuncName);
02961 SUMA_RETURN(NULL);
02962 }
02963
02964 /* insert from multiplexed rgb vector */
02965 SUMA_allow_nel_use(1);
02966 if (!SUMA_AddNelCol (nel, "red", SUMA_NODE_Rb, (void *)rgba, NULL ,4 )) {
02967 fprintf (stderr,"Error %s:\nFailed in SUMA_AddNelCol", FuncName);
02968 SUMA_RETURN(NULL);
02969 }
02970
02971 SUMA_allow_nel_use(1);
02972 if (!SUMA_AddNelCol (nel, "green", SUMA_NODE_Gb, (void *)(rgba+1), NULL ,4)) {
02973 fprintf (stderr,"Error %s:\nFailed in SUMA_AddNelCol", FuncName);
02974 SUMA_RETURN(NULL);
02975 }
02976
02977 SUMA_allow_nel_use(1);
02978 if (!SUMA_AddNelCol (nel, "blue", SUMA_NODE_Bb, (void *)(rgba+2), NULL ,4)) {
02979 fprintf (stderr,"Error %s:\nFailed in SUMA_AddNelCol", FuncName);
02980 SUMA_RETURN(NULL);
02981 }
02982
02983 SUMA_allow_nel_use(1);
02984 if (!SUMA_AddNelCol (nel, "alpha", SUMA_NODE_Ab, (void *)(rgba+3), NULL ,4)) {
02985 fprintf (stderr,"Error %s:\nFailed in SUMA_AddNelCol", FuncName);
02986 SUMA_RETURN(NULL);
02987 }
02988
02989
02990 ++i_in;
02991
02992 if (cleanup == -1) {
02993 SUMA_LH("Last or one call only cleanup");
02994 SUMA_NODEVAL2IRGBA_CLEANUP;
02995 past_instance[0]='\0';
02996 i_in = 0;
02997 }
02998
02999 /* return the element */
03000 SUMA_RETURN(nel);
03001
03002 }
|
|
||||||||||||||||||||
|
A function to turn node XYZ to nel to be sent to SUMA There's nothing to cleanup so worry not about making a cleanup call
Definition at line 2464 of file SUMA_niml.c. References cleanup(), SUMA_SurfaceObject::idcode_str, SUMA_SurfaceObject::Label, LocalHead, SUMA_SurfaceObject::N_Node, NI_add_column_stride(), NI_FLOAT, NI_set_attribute(), SUMA_SurfaceObject::NodeDim, SUMA_SurfaceObject::nodelist_idcode_str, SUMA_AddNelCol(), SUMA_allow_nel_use(), SUMA_Boolean, SUMA_DSET_TYPE, SUMA_EMPTY_ATTR, SUMA_ENTRY, SUMA_LH, SUMA_NEW_NODE_XYZ, SUMA_NewNel(), SUMA_NODE_3C, SUMA_NODE_XYZ, SUMA_RETURN, and SUMA_SL_Err. Referenced by SUMA_SendSumaNewSurface(), SUMA_SendToSuma(), and SUMA_SO2nimlSO().
02465 {
02466 static char FuncName[]={"SUMA_NodeXYZ2NodeXYZ_nel"};
02467 static int i_in=0;
02468 char stmp[500];
02469 NI_element *nel=NULL;
02470 SUMA_Boolean LocalHead = NOPE;
02471
02472 SUMA_ENTRY;
02473
02474 if (dtype != SUMA_NEW_NODE_XYZ && dtype != SUMA_NODE_XYZ) {
02475 SUMA_SL_Err("Bad dtype for this function!");
02476 SUMA_RETURN(NULL);
02477 }
02478
02479 if (cleanup) {
02480 SUMA_LH("Cleanup...");
02481 SUMA_RETURN(NULL);
02482 }
02483
02484 if (SO->NodeDim != 3) { /* only deals with XYZ for the moment */
02485 SUMA_SL_Err("NodeDim must be 3!");
02486 SUMA_RETURN(nel);
02487 }
02488
02489 if (!i_in) {
02490 /* Initialization block. Nothing to do , really */
02491
02492 }
02493
02494
02495 /* Now create that data element and write it out */
02496 SUMA_allow_nel_use(1);
02497 nel = SUMA_NewNel ( dtype, /* one of SUMA_DSET_TYPE */
02498 SO->idcode_str, /* idcode of Domain Parent Surface*/
02499 NULL, /* idcode of geometry parent, not useful here*/
02500 3*SO->N_Node,
02501 NULL,
02502 SO->nodelist_idcode_str);
02503 if (!nel) {
02504 fprintf (stderr,"Error %s:\nFailed in SUMA_NewNel", FuncName);
02505 SUMA_RETURN(NULL);
02506 }
02507
02508 sprintf(stmp, "%d", SO->NodeDim);
02509 NI_set_attribute (nel, "Node_Dim", stmp);
02510
02511 #if 0 /* no longer needed */
02512 /* set the surface idcode attribute */
02513 NI_set_attribute (nel, "surface_idcode", SO->idcode_str);
02514 #endif
02515
02516 /* set the label */
02517 if (SO->Label) {
02518 sprintf(stmp, "NodeList for surface %s", SO->Label);
02519 NI_set_attribute (nel, "Object_Label", stmp);
02520 } else {
02521 NI_set_attribute (nel, "Object_Label", SUMA_EMPTY_ATTR);
02522 }
02523
02524 #if 0 /* old way */
02525 /* Add the coordinate column */
02526 if (!SUMA_AddNelCol (nel, /* the famed nel */
02527 "XYZ coords",
02528 SUMA_NODE_3C, /* the column's type (description),
02529 one of SUMA_COL_TYPE */
02530 (void *)val, /* the coordinates */
02531 NULL /* that's an optional structure containing
02532 attributes of the added column.
02533 Not used at the moment */
02534 ,1
02535 )) {
02536 fprintf (stderr,"Error %s:\nFailed in SUMA_AddNelCol", FuncName);
02537 SUMA_RETURN(NULL);
02538 }
02539 #else /* new way, no need for embellishments */
02540 NI_add_column_stride ( nel, NI_FLOAT, val, 1 );
02541 #endif
02542 ++i_in;
02543
02544 /* return the element */
02545 SUMA_RETURN(nel);
02546
02547
02548 }
|
|
||||||||||||
|
The inverse of SUMA_NodeXYZ2NodeXYZ_nel Definition at line 2398 of file SUMA_niml.c. References SUMA_SurfaceObject::idcode_str, LocalHead, SUMA_SurfaceObject::N_Node, NI_element::name, NI_get_attribute(), SUMA_SurfaceObject::NodeDim, SUMA_SurfaceObject::NodeList, SUMA_SurfaceObject::nodelist_idcode_str, SUMA_Boolean, SUMA_copy_string(), SUMA_DSET_TYPE, SUMA_Dset_Type(), SUMA_ENTRY, SUMA_free, SUMA_IS_EMPTY_STR_ATTR, SUMA_malloc, SUMA_NEW_NODE_XYZ, SUMA_NODE_XYZ, SUMA_RETURN, SUMA_SL_Crit, SUMA_SL_Err, NI_element::vec, and NI_element::vec_len. Referenced by SUMA_nimlSO2SO().
02399 {
02400 static char FuncName[]={"SUMA_NodeXYZ_nel2NodeXYZ"};
02401 char *tmp = NULL;
02402 SUMA_DSET_TYPE dtype;
02403 SUMA_Boolean LocalHead = NOPE;
02404
02405 SUMA_ENTRY;
02406
02407 dtype = SUMA_Dset_Type(nel->name);
02408
02409 if (dtype != SUMA_NODE_XYZ && dtype != SUMA_NEW_NODE_XYZ) {
02410 SUMA_SL_Err("Bad nel for this function");
02411 SUMA_RETURN(NOPE);
02412 }
02413
02414 tmp = NI_get_attribute(nel, "Node_Dim");
02415 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) {
02416 SO->NodeDim = atoi(tmp);
02417 if (SO->NodeDim != 3) {
02418 SUMA_SL_Err("Not willing to deal with SO->NodeDim != 3");
02419 SUMA_RETURN(NOPE);
02420 }
02421 }
02422
02423 tmp = NI_get_attribute(nel, "Object_ID");
02424 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) SO->nodelist_idcode_str = SUMA_copy_string(tmp);
02425
02426 tmp = NI_get_attribute(nel, "Parent_ID");
02427 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) {
02428 if (strcmp(tmp, SO->idcode_str)) {
02429 SUMA_SL_Err("idcode of parent mismatch"); SUMA_RETURN(NOPE);
02430 }
02431 }
02432
02433 /* how many elements? */
02434 if (SO->N_Node) {
02435 if (SO->N_Node == nel->vec_len/SO->NodeDim) {
02436 if (!SO->NodeList) {
02437 SUMA_SL_Err("Bad initial values in SO. SO->N_Node == nel->vec_len/3 but NULL SO->NodeList");
02438 SUMA_RETURN(NOPE);
02439 }
02440 } else {
02441 /* gotta cleanup */
02442 if (SO->NodeList) SUMA_free(SO->NodeList); SO->NodeList = NULL; SO->N_Node = 0;
02443 }
02444 } else {
02445 if (SO->NodeList) { SUMA_SL_Err("Should not have a NodeList here"); SUMA_RETURN(NOPE); }
02446 }
02447
02448 SO->N_Node = nel->vec_len/SO->NodeDim;
02449 if (!SO->NodeList) SO->NodeList = (float *)SUMA_malloc(nel->vec_len * sizeof(float));
02450 if (!SO->NodeList) {
02451 SUMA_SL_Crit("Failed to allocate"); SUMA_RETURN(NOPE);
02452 }
02453 memcpy((void *)SO->NodeList, nel->vec[0], nel->vec_len * sizeof(float));
02454
02455 SUMA_RETURN(YUP);
02456 }
|
|
||||||||||||
|
Process NIML data. ------------------------------------------------------------------------ Definition at line 379 of file SUMA_niml.c. References SUMA_OVERLAY_PLANE_DATA::a, SUMA_SurfaceObject::AnatCorrect, SUMA_OVERLAY_PLANE_DATA::b, SUMA_CommonFields::Connected_v, SUMA_SurfaceViewer::CurGroupName, SUMA_OVERLAY_PLANE_DATA::DimFact, SUMA_NEW_SO_OPT::DoCenter, SUMA_NEW_SO_OPT::DoMetrics, SUMA_NEW_SO_OPT::DoNormals, SUMA_CommonFields::DsetList, SUMA_SurfaceObject::EmbedDim, SUMA_SurfaceObject::FaceSetDim, SUMA_SurfaceObject::FaceSetList, SUMA_SurfaceViewer::Focus_SO_ID, SUMA_OVERLAY_PLANE_DATA::g, SUMA_OVERLAY_PLANE_DATA::GlobalOpacity, SUMA_SurfaceObject::Group, SUMA_OVERLAY_PLANE_DATA::i, i, SUMA_SurfaceObject::idcode_str, SUMA_NEW_SO_OPT::idcode_str, IJK, SUMA_OVERLAY_PLANE_DATA::isBackGrnd, SUMA_SurfaceObject::Label, SUMA_SurfaceViewer::LinkAfniCrossHair, SUMA_SurfaceObject::LocalDomainParentID, LocalHead, SUMA_OVERLAY_PLANE_DATA::N, SUMA_SurfaceObject::N_FaceSet, SUMA_SurfaceObject::N_Node, NI_group::name, NI_element::name, NI_BYTE, NI_ELEMENT_TYPE, NI_element_type(), NI_FLOAT, NI_get_attribute(), NI_GROUP_TYPE, NI_INT, NI_sleep(), SUMA_SurfaceObject::NodeDim, SUMA_SurfaceObject::NodeList, SUMA_DO::OP, SUMA_OVERLAY_PLANE_DATA::r, r, SUMA_SurfaceViewer::ResetGLStateVariables, SE_BindCrossHair, SE_Redisplay, SE_Redisplay_AllVisible, SE_SetAfniThisSurf, SE_SetCrossHair, SE_SetSOinFocus, SE_ToggleConnected, SEF_cp, SEF_fv3, SEF_i, SEF_iv3, SEF_s, SEI_Head, SEI_In, SEI_Tail, SES_Afni, SES_Suma, SES_SumaFromAfni, SES_SumaFromAny, SUMA_OVERLAY_PLANE_DATA::Show, SO_type, SOPT_ibbb, SUMA_OVERLAY_PLANE_DATA::Source, SUMA_SurfaceObject::State, strtod(), SUMA_AddDO(), SUMA_AFNI_COLORPLANE_OPACITY, SUMA_AFNI_STREAM_INDEX, SUMA_Boolean, SUMA_copy_string(), SUMA_CreateList(), SUMA_DIM_AFNI_COLOR_FACTOR, SUMA_Engine(), SUMA_ENTRY, SUMA_findSO_inDOv(), SUMA_findSOp_inDOv(), SUMA_free, SUMA_Free_Surface_Object(), SUMA_Free_VolPar(), SUMA_FreeNewSOOpt(), SUMA_InitializeEngineListData(), SUMA_iRGB_to_OverlayPointer(), SUMA_IS_EMPTY_STR_ATTR, SUMA_LH, SUMA_LOCAL, SUMA_malloc, SUMA_MAX_COMMAND_LENGTH, SUMA_MAX_DISPLAYABLE_OBJECTS, SUMA_MAX_STRING_LENGTH, SUMA_MAX_SURF_VIEWERS, SUMA_nel_stdout(), SUMA_NewNewSOOpt(), SUMA_NewSO(), SUMA_niml_hangup(), SUMA_nimlSO2SO(), SUMA_PrepAddmappableSO(), SUMA_PrepSO_GeomProp_GL(), SUMA_RECOMPUTE_NORMALS, SUMA_REGISTER_HEAD_COMMAND_NO_DATA, SUMA_REGISTER_TAIL_COMMAND_NO_DATA, SUMA_RegisteredSOs(), SUMA_RegisterEngineListCommand(), SUMA_RegisterGroup(), SUMA_RETURN, SUMA_S_Err, SUMA_SetRemixFlag(), SUMA_SetupSVforDOs(), SUMA_SL_Crit, SUMA_SL_Err, SUMA_SL_Note, SUMA_SL_Warn, SUMA_SLP_Err, SUMA_SLP_Warn, SUMA_SOGroup_2_Spec(), SUMA_SwitchGroups(), SUMA_SwitchState(), SUMA_SurfaceObject::SUMA_VolPar_Aligned, SUMA_VolPar_Attr(), SUMA_which_stream_index(), SUMA_WhichState(), SUMA_XYZmap_XYZ(), SUMAg_N_DOv, SUMAg_N_SVv, SUMA_X::TOPLEVEL, SUMA_CommonFields::TrackingId_v, tt, SUMA_OVERLAY_PLANE_DATA::Type, NI_element::vec, NI_element::vec_filled, NI_element::vec_len, NI_element::vec_num, NI_element::vec_typ, SUMA_SurfaceObject::VolPar, and SUMA_SurfaceViewer::X. Referenced by SUMA_niml_workproc().
00380 {
00381 static char FuncName[]={"SUMA_process_NIML_data"};
00382 int tt = NI_element_type(nini) ;
00383 int OverInd, loc_ID, iview, *IJK=NULL, N_Node, *FaceSetList=NULL, N_FaceSet;
00384 int i, I_C = -1, nodeid = -1, iv3[3], dest_SO_ID = -1,
00385 N_SOlist, SOlist[SUMA_MAX_DISPLAYABLE_OBJECTS];
00386 NI_element *nel = NULL ;
00387 NI_group *ngr = NULL;
00388 SUMA_EngineData *ED = NULL;
00389 DList *list = NULL;
00390 DListElmt *Elm = NULL;
00391 char CommString[SUMA_MAX_COMMAND_LENGTH], *nel_surfidcode = NULL, *nel_nodeid = NULL;
00392 char s[SUMA_MAX_STRING_LENGTH], sfield[100], sdestination[100], ssource[100];
00393 float **fm, dimfact, *XYZ=NULL, *NodeList=NULL;
00394 byte *r, *g, *b;
00395 byte BrandNew = YUP;
00396 SUMA_NEW_SO_OPT *nsoopt=NULL;
00397 SUMA_Boolean Empty_irgba = NOPE, Found = NOPE;
00398 SUMA_SurfaceObject *SO = NULL;
00399 SUMA_SurfaceViewer *svi = NULL;
00400 SUMA_OVERLAYS * tmpptr;
00401 GLfloat *glar_ColorList = NULL;
00402 SUMA_OVERLAY_PLANE_DATA sopd;
00403 SUMA_SurfSpecFile *Spec=NULL;
00404 SUMA_Boolean iselement = YUP;
00405 SUMA_Boolean LocalHead = NOPE;
00406
00407 /*int it;
00408 float fv3[3], fv15[15];*/
00409 /*float ft;
00410 int **im, iv15[15];*/ /* keep unused variables undeclared to quite compiler */
00411
00412 SUMA_ENTRY;
00413
00414 if( tt < 0 ) {/* should never happen */
00415 fprintf(SUMA_STDERR,"Error %s: Should never have happened.\n", FuncName);
00416 SUMA_RETURN(NOPE);
00417 }
00418
00419
00420 SUMA_LH("Checking on nini type");
00421 /* check if group or element */
00422 if(tt == NI_GROUP_TYPE) {
00423 iselement = NOPE;
00424 SUMA_LH("Dealing with group");
00425 } else if (tt == NI_ELEMENT_TYPE) {
00426 iselement = YUP;
00427 SUMA_LH("Dealing with element");
00428 } else {
00429 fprintf(SUMA_STDERR,"Error %s: Not an element, nor a group. What the hell are you doing?\n", FuncName);
00430 SUMA_RETURN(NOPE);
00431 }
00432
00433
00434 if (iselement) {
00435 /* if here, have a single data element;
00436 process the data based on the element name */
00437
00438 nel = (NI_element *) nini ;
00439
00440 if (LocalHead) {
00441 fprintf(SUMA_STDERR,"%s: name=%s vec_len=%d vec_filled=%d, vec_num=%d\n", FuncName,\
00442 nel->name, nel->vec_len, nel->vec_filled, nel->vec_num );
00443 }
00444
00445 /*--- stream closer ---*/
00446 if( strcmp(nel->name,"CloseKillStream") == 0) { /* CloseKillStream */
00447 if (LocalHead) fprintf (SUMA_STDERR,"%s:\nClosing then killing stream %s ...\n",
00448 FuncName, NI_get_attribute(nel, "ni_stream_name"));
00449 if (!SUMA_niml_hangup (SUMAg_CF, NI_get_attribute(nel, "ni_stream_name"), NOPE, YUP)) {
00450 SUMA_SL_Err("Failed in SUMA_niml_hangup.\n");
00451 SUMA_RETURN(NOPE);
00452 }
00453 SUMA_RETURN(YUP);
00454 } /* CloseStreamKill */
00455
00456 /*--- stream tracking ON ---*/
00457 if( strcmp(nel->name,"StartTracking") == 0) { /* Start tracking */
00458 if (LocalHead) fprintf (SUMA_STDERR,"%s:\n Starting NI element tracking for %s ...\n",
00459 FuncName, NI_get_attribute(nel, "ni_stream_name"));
00460 i = SUMA_which_stream_index(SUMAg_CF, NI_get_attribute(nel, "ni_stream_name"));
00461 if ( i < 0) {
00462 SUMA_SL_Err("Failed to find stream!\n");
00463 SUMA_RETURN(NOPE);
00464 }
00465 if (NI_get_attribute(nel, "Tracking_ID")) {
00466 if (atoi(NI_get_attribute(nel, "Tracking_ID")) != 1) {
00467 SUMA_SL_Err("First tracking element is not 1.\nTracking ignored.\n");
00468 SUMA_RETURN(YUP);
00469 }
00470 }
00471 SUMA_LH("Tracking on ...");
00472 SUMAg_CF->TrackingId_v[i] = 1; /* this is to be the first element ! */
00473 SUMA_RETURN(YUP);
00474 } /* Start tracking */
00475
00476 /*--- stream tracking OFF ---*/
00477 if( strcmp(nel->name,"StopTracking") == 0) { /* Stop tracking */
00478 if (LocalHead) fprintf (SUMA_STDERR,"%s:\n Stopping NI element tracking for %s ...\n",
00479 FuncName, NI_get_attribute(nel, "ni_stream_name"));
00480 i = SUMA_which_stream_index(SUMAg_CF, NI_get_attribute(nel, "ni_stream_name"));
00481 if ( i < 0) {
00482 SUMA_SL_Err("Failed to find stream!\n");
00483 SUMA_RETURN(NOPE);
00484 }
00485 SUMA_LH("Tracking Off ...");
00486 SUMAg_CF->TrackingId_v[i] = 0; /* this is to be the first element ! */
00487 SUMA_RETURN(YUP);
00488 } /* Stop tracking */
00489
00490 /*--- CrossHair XYZ --- */
00491 if( strcmp(nel->name,"SUMA_crosshair_xyz") == 0) {/* SUMA_crosshair_xyz */
00492 /* Do it for all viewers */
00493 for (iview = 0; iview < SUMAg_N_SVv; ++iview) {
00494 svi = &(SUMAg_SVv[iview]);
00495 if (svi->LinkAfniCrossHair) {/* link cross hair */
00496 /* look for the surface idcode */
00497 nel_surfidcode = NI_get_attribute(nel, "surface_idcode");
00498 if (SUMA_IS_EMPTY_STR_ATTR(nel_surfidcode)) nel_surfidcode = NI_get_attribute(nel, "Parent_ID");
00499 if (SUMA_IS_EMPTY_STR_ATTR(nel_surfidcode)) {
00500 if (LocalHead) fprintf(SUMA_STDERR,"%s: surface_idcode missing in nel (%s), using svi->Focus_SO_ID.\n", FuncName, nel->name);
00501 dest_SO_ID = svi->Focus_SO_ID; /* default */
00502 } else {
00503 /* first try to find out if one of the displayed surfaces has a parent equal to nel_surfidcode */
00504 if (LocalHead) fprintf (SUMA_STDERR,"%s: Searching displayed surfaces.\n", FuncName);
00505 Found = NOPE;
00506 i = 0;
00507 N_SOlist = SUMA_RegisteredSOs(svi, SUMAg_DOv, SOlist);
00508 while (i < N_SOlist && !Found) {
00509 SO = (SUMA_SurfaceObject *)(SUMAg_DOv[SOlist[i]].OP);
00510 if (strcmp(nel_surfidcode, SO->LocalDomainParentID) == 0) {
00511 Found = YUP;
00512 dest_SO_ID = SOlist[i];
00513 }
00514 ++i;
00515 }
00516 /* if not found, look for any DO */
00517 if (!Found) {
00518 if (LocalHead) fprintf (SUMA_STDERR,"%s: None of the displayed surfaces (or their parents) match nel_surfidcode. Trying all of DOv...\n", FuncName);
00519 dest_SO_ID = SUMA_findSO_inDOv (nel_surfidcode, SUMAg_DOv, SUMAg_N_DOv);
00520 if (dest_SO_ID < 0) {
00521 if (LocalHead) fprintf(SUMA_STDERR,"%s:%s: nel idcode is not found in DOv.\n", FuncName, nel->name);
00522 dest_SO_ID = svi->Focus_SO_ID;
00523 } else { /* good, set SO accordingly */
00524 if (LocalHead) fprintf(SUMA_STDOUT,"%s: DOv[%d] Matched idcode\n", FuncName, dest_SO_ID);
00525 }
00526 }
00527 }
00528
00529 SO = (SUMA_SurfaceObject *)(SUMAg_DOv[dest_SO_ID].OP);
00530
00531 if (LocalHead) SUMA_nel_stdout (nel);
00532
00533 /* check for node id */
00534 nel_nodeid = NI_get_attribute (nel, "surface_nodeid");
00535 if (!nel_nodeid) nodeid = -1;
00536 else {
00537 if (strlen(nel_nodeid)) nodeid = (int)strtod(nel_nodeid, NULL);
00538 else nodeid = -1;
00539 }
00540
00541 /*-- check element for suitability --*/
00542 if( nel->vec_len < 1 || nel->vec_filled < 1) { /* empty element? */
00543 SUMA_SLP_Warn ("Empty crosshair xyz.\n");
00544 SUMA_RETURN(YUP);
00545 }
00546
00547 if( nel->vec_len != 3 || nel->vec_num != 1 || nel->vec_typ[0] != NI_FLOAT) {
00548 SUMA_SLP_Err( "SUMA_crosshair_xyz requires\n"
00549 "3 floats in one vector.\n");
00550 SUMA_RETURN(NOPE);
00551 }
00552
00553
00554 /* nodeid is supplied, even if the distance from the cross hair to the node is large,
00555 set a limit */
00556 if (nodeid >= 0) {
00557 SUMA_LH("Node index courtesy of AFNI");
00558 /* get the XYZ on the mapping reference */
00559 I_C = -1;
00560 XYZ = SUMA_XYZmap_XYZ (nel->vec[0], SO, SUMAg_DOv, SUMAg_N_DOv, &I_C);
00561 if (!XYZ) {
00562 SUMA_SL_Warn("AFNI cross hair too\n"
00563 "far from surface.\n"
00564 "No action taken.");
00565 XBell (XtDisplay (sv->X->TOPLEVEL), 50);
00566 SUMA_RETURN(YUP);
00567 }
00568 I_C = nodeid; /* node index is set by AFNI */
00569 } else {
00570 SUMA_LH("Searching for node index.");
00571 /* set the cross hair XYZ for now and let SUMA_XYZmap_XYZ set the node index*/
00572 I_C = -1;
00573 XYZ = SUMA_XYZmap_XYZ (nel->vec[0], SO, SUMAg_DOv, SUMAg_N_DOv, &I_C);
00574
00575 if (XYZ == NULL || I_C < 0) {
00576 SUMA_SL_Warn("AFNI cross hair too\n"
00577 "far from surface.\n"
00578 "No action taken.");
00579 XBell (XtDisplay (sv->X->TOPLEVEL), 50);
00580 SUMA_RETURN(YUP);
00581 }
00582 }
00583
00584 /* attach the cross hair to the selected surface */
00585 #if 0
00586 if (nel_surfidcode == NULL) {
00587 fprintf(SUMA_STDERR,"Error %s: surface_idcode missing in nel (%s).\nLoose Crosshair\n", FuncName, nel->name);
00588 iv3[0] = -1;
00589 } else {
00590 iv3[0] = dest_SO_ID;
00591 }
00592 #else
00593 iv3[0] = dest_SO_ID; /* nel_surfidcode == NULL is handled above, May 15 03*/
00594 #endif
00595
00596 iv3[1] = I_C; /* use the closest node for a link otherwise when you switch states, you'll get a wandering cross hair */
00597 if (!list) list = SUMA_CreateList();
00598 ED = SUMA_InitializeEngineListData (SE_BindCrossHair);
00599 if (!SUMA_RegisterEngineListCommand ( list, ED,
00600 SEF_iv3, (void*)iv3,
00601 SES_SumaFromAfni, (void *)svi, NOPE,
00602 SEI_Head, NULL)) {
00603 fprintf(SUMA_STDERR,"Error %s: Failed to register element\n", FuncName);
00604 SUMA_RETURN (NOPE);
00605 }
00606
00607 /* send cross hair coordinates */
00608 ED = SUMA_InitializeEngineListData (SE_SetCrossHair);
00609 if (!SUMA_RegisterEngineListCommand ( list, ED,
00610 SEF_fv3, (void*)XYZ,
00611 SES_SumaFromAfni, svi, NOPE,
00612 SEI_Tail, NULL)) {
00613 fprintf(SUMA_STDERR,"Error %s: Failed to register element\n", FuncName);
00614 SUMA_RETURN (NOPE);
00615 }
00616
00617 svi->ResetGLStateVariables = YUP;
00618
00619 #if 0
00620 /* logic for that not too clear yet */
00621 /* set the SO in Focus */
00622 ED = SUMA_InitializeEngineListData (SE_SetSOinFocus);
00623 if (!SUMA_RegisterEngineListCommand ( list, ED,
00624 SEF_i, (void*)&dest_SO_ID,
00625 SES_SumaFromAfni, (void *)svi, NOPE,
00626 SEI_Tail, NULL)) {
00627 fprintf(SUMA_STDERR,"Error %s: Failed to register element\n", FuncName);
00628 SUMA_RETURN (NOPE);
00629 }
00630 #endif
00631
00632 SUMA_REGISTER_TAIL_COMMAND_NO_DATA(list, SE_Redisplay, SES_SumaFromAfni, svi);
00633 if (!SUMA_Engine (&list)) {
00634 fprintf(SUMA_STDERR, "Error %s: SUMA_Engine call failed.\n", FuncName);
00635 }
00636
00637 } /* link cross hair */
00638 } /* iview ... for all viewers */
00639 /* don't free nel, it's freed later on
00640 dont't free attributes obtained in NI_get_attribute, they are copies of pointers in nel */
00641 SUMA_RETURN(YUP) ;
00642 }/* SUMA_crosshair_xyz */
00643
00644 /* New surface mesh_IJK, This one is now obsolete, along with NewNode_XYZ, they were used to send a surface in chunks, now
00645 I can send an entire surface. Look at commented out section in SUMA_Mesh_IJK2Mesh_IJK_nel if you want to reuse this chunk*/
00646 if (strcmp(nel->name,"NewMesh_IJK") == 0) { /* NewMesh_IJK */
00647 SUMA_SL_Err("Element obsolete. Please use SUMA_SurfaceObject");
00648 SUMA_RETURN(NOPE) ;
00649 if( nel->vec_len < 1 || nel->vec_filled < 1) { /* empty element? */
00650 fprintf(SUMA_STDERR,"%s: Empty NewMesh_IJK\n", FuncName);
00651 SUMA_RETURN(NOPE);
00652 }else {
00653 if( nel->vec_num != 1 || nel->vec_typ[0] != NI_INT) {
00654 fprintf(SUMA_STDERR,"%s: NewMesh_IJK Bad format\n", FuncName);
00655 SUMA_RETURN(NOPE);
00656 }
00657 }
00658 /* show me nel */
00659 /* if (LocalHead) SUMA_nel_stdout (nel); */
00660 /* look for the surface idcode */
00661 nel_surfidcode = NI_get_attribute(nel, "surface_idcode");
00662 if (SUMA_IS_EMPTY_STR_ATTR(nel_surfidcode)) nel_surfidcode = NI_get_attribute(nel, "Parent_ID");
00663 if (SUMA_IS_EMPTY_STR_ATTR(nel_surfidcode)) {
00664 fprintf(SUMA_STDERR,"Error %s: surface_idcode missing in nel (%s).\n", FuncName, nel->name);
00665 SUMA_RETURN(NOPE);
00666 }
00667
00668 SUMA_LH("Checking for new surface...");
00669 SO = SUMA_findSOp_inDOv (nel_surfidcode, SUMAg_DOv, SUMAg_N_DOv);
00670 if (SO) {
00671 fprintf(SUMA_STDERR,"Warning %s: nel idcode was found in DOv.\nChecking for mesh compatibility\n", FuncName);
00672 if (SO->N_FaceSet * SO->FaceSetDim == nel->vec_len) {
00673 fprintf(SUMA_STDERR,"Note %s: Mesh dimensions match. New mesh will be adopted.\n", FuncName);
00674 } else {
00675 fprintf(SUMA_STDERR,"Error %s: Mesh dimensions mismatch.\n", FuncName);
00676 SUMA_RETURN(NOPE);
00677 }
00678 }
00679
00680 /* get the number of nodes */
00681 if (!NI_get_attribute(nel, "N_Node")) {
00682 fprintf(SUMA_STDERR,"Error %s: NULL or non existent N_Node field.\n", FuncName);
00683 SUMA_RETURN(NOPE);
00684 }
00685
00686 if (LocalHead) fprintf(SUMA_STDERR,"Number of nodes:%s...\n", NI_get_attribute(nel, "N_Node"));
00687 N_Node = atoi(NI_get_attribute(nel, "N_Node"));
00688 if (N_Node <= 0 || N_Node > 1000000) {
00689 fprintf(SUMA_STDERR,"Error %s: Bad number of nodes %d (limit of 1000000 nodes.)\n", FuncName, N_Node);
00690 SUMA_RETURN(NOPE);
00691 }
00692
00693 if (!SO) {
00694 SUMA_LH("A brand new surface.");
00695 BrandNew = YUP;
00696 NodeList = (float *)SUMA_malloc(3 * N_Node * sizeof(float)); /* do not use calloc so that you can see something ... */
00697 FaceSetList = (int *)SUMA_malloc(nel->vec_len * sizeof(int));
00698 if (!NodeList || !FaceSetList) {
00699 SUMA_SL_Crit("Failed to allocate for NodeList || FaceSetList");
00700 SUMA_RETURN(NOPE);
00701 }
00702 IJK = (int *)nel->vec[0];
00703 N_FaceSet = nel->vec_len / 3;
00704 if (nel->vec_len % 3) {
00705 fprintf(SUMA_STDERR,"Error %s: Bad number of elements in IJK vector not divisible by 3! %d\n", FuncName, nel->vec_len);
00706 SUMA_RETURN(NOPE);
00707 }
00708 SUMA_LH("Copying new mesh");
00709 for (i=0; i < nel->vec_len; ++i) FaceSetList[i] = IJK[i];
00710 /* Now form the new surface */
00711 SUMA_LH("Now forming new surface");
00712 nsoopt = SUMA_NewNewSOOpt();
00713 nsoopt->DoNormals = NOPE; nsoopt->DoMetrics = NOPE; nsoopt->DoCenter = NOPE;
00714 nsoopt->idcode_str = SUMA_copy_string(nel_surfidcode);
00715 SO = SUMA_NewSO(&NodeList, N_Node, &FaceSetList, N_FaceSet, nsoopt);
00716 nsoopt=SUMA_FreeNewSOOpt(nsoopt);
00717 } else {
00718 SUMA_LH("A refit of an existing surface.");
00719 BrandNew = NOPE;
00720 if (N_Node != SO->N_Node) {
00721 fprintf(SUMA_STDERR,"Error %s: Mismatch in number of nodes between new mesh and pre-existing one (%d vs %d)\n", FuncName, N_Node, SO->N_Node);
00722 SUMA_RETURN(NOPE);
00723 }
00724 IJK = (int *)nel->vec[0];
00725 for (i=0; i < nel->vec_len; ++i) SO->FaceSetList[i] = IJK[i];
00726 }
00727
00728 /* work the mesh a little and add it to DOv NO LONGER DONE HERE...*/
00729 SO->Group = SUMA_copy_string(NI_get_attribute(nel, "Group"));
00730 if (!SO->Group) SO->Group = SUMA_copy_string(NI_get_attribute(nel, "Subject_Label"));
00731 SO->State = SUMA_copy_string(NI_get_attribute(nel, "State"));
00732 if (!SO->State) SO->State = SUMA_copy_string(NI_get_attribute(nel, "Layer_Name"));
00733 SO->Label = SUMA_copy_string(NI_get_attribute(nel, "Label"));
00734 if (!SO->Label) SO->Label = SUMA_copy_string(NI_get_attribute(nel, "Object_Label"));
00735 SO->EmbedDim = atoi(NI_get_attribute(nel, "EmbedDim"));
00736 if (!SO->EmbedDim) SO->EmbedDim = atoi(NI_get_attribute(nel, "Embedding_Dimension"));
00737 SO->AnatCorrect = atoi(NI_get_attribute(nel, "AnatCorrect"));
00738 if (!SO->AnatCorrect) {
00739 char *tmp = NI_get_attribute(nel, "Anatomically_Correct");
00740 if (tmp) {
00741 if (strstr(tmp,"yes")) SO->AnatCorrect = 1;
00742 else if (strstr(tmp,"no")) SO->AnatCorrect = 0;
00743 }
00744 }
00745 /* add this surface to DOv */
00746 if (BrandNew) {
00747 if (!SUMA_AddDO(SUMAg_DOv, &(SUMAg_N_DOv), (void *)SO, SO_type, SUMA_LOCAL)) {
00748 fprintf(SUMA_STDERR,"Error %s: Error Adding DO\n", FuncName);
00749 SUMA_RETURN(NOPE);
00750 }
00751 }
00752
00753 /* don't free nel, it's freed later on */
00754 SUMA_RETURN(YUP) ;
00755 }/* NewMesh_IJK */
00756
00757 if (strcmp(nel->name,"PrepNewSurface") == 0) { /* PrepNewSurface */
00758 /* show me nel */
00759 /* if (LocalHead) SUMA_nel_stdout (nel); */
00760 /* look for the surface idcode */
00761 nel_surfidcode = NI_get_attribute(nel, "surface_idcode");
00762 if (SUMA_IS_EMPTY_STR_ATTR(nel_surfidcode)) nel_surfidcode = NI_get_attribute(nel, "Parent_ID");
00763 if (SUMA_IS_EMPTY_STR_ATTR(nel_surfidcode)) {
00764 fprintf(SUMA_STDERR,"Error %s: surface_idcode missing in nel (%s).\n", FuncName, nel->name);
00765 SUMA_RETURN(NOPE);
00766 }
00767 SUMA_LH("Looking for surface...");
00768 SO = SUMA_findSOp_inDOv (nel_surfidcode, SUMAg_DOv, SUMAg_N_DOv);
00769 if (!SO) {
00770 fprintf(SUMA_STDERR,"Error %s: nel idcode was not found in DOv.\n", FuncName);
00771 SUMA_RETURN(NOPE);
00772 }
00773
00774 if (LocalHead) fprintf(SUMA_STDERR,"%s: Surface SO about to be prepped: Label %s, State %s, Group %s\n", FuncName, SO->Label, SO->State, SO->Group);
00775
00776 #if 0
00777 if (NI_get_attribute(nel, "VolParFilecode")) {
00778 SO->VolPar = SUMA_VolPar_Attr (NI_get_attribute(nel, "VolParFilecode"));
00779 if (!SO->VolPar) {
00780 SUMA_S_Err("Failed in SUMA_VolPar_Attr");
00781 SUMA_RETURN(NOPE);
00782 }
00783 SO->SUMA_VolPar_Aligned = YUP; /* Surface should already be in alignment with volume, should not call SUMA_Align_to_VolPar ... */
00784 }
00785 #else
00786 /* VolPar should have been dealt with by now */
00787 if (!SO->VolPar) SO->SUMA_VolPar_Aligned = NOPE;
00788 else SO->SUMA_VolPar_Aligned = YUP; /* Surface should already be in alignment with volume, should not call SUMA_Align_to_VolPar ... */
00789 #endif
00790
00791 /* make this surface friendly for suma */
00792 if (!SUMA_PrepSO_GeomProp_GL(SO)) {
00793 SUMA_S_Err("Failed in SUMA_PrepSO_GeomProp_GL");
00794 SUMA_RETURN(NOPE);
00795 }
00796 /* Add this surface to SUMA's displayable objects */
00797 if (!SUMA_PrepAddmappableSO(SO, SUMAg_DOv, &(SUMAg_N_DOv), 0, SUMAg_CF->DsetList)) {
00798 SUMA_S_Err("Failed to add mappable SOs ");
00799 SUMA_RETURN(NOPE);
00800 }
00801 /* create a fake spec, be damned gates of spec! */
00802 Spec = SUMA_SOGroup_2_Spec (&SO, 1);
00803
00804 /* register the new group with SUMA */
00805 if (!SUMA_RegisterGroup(SUMAg_CF, Spec)) {
00806 SUMA_SL_Err("Failed to register group");
00807 SUMA_RETURN(NOPE);
00808 }
00809
00810 /* Register the surfaces in Spec file with the surface viewer and perform setups */
00811 if (LocalHead) fprintf (SUMA_STDERR, "%s: Registering surfaces with surface viewers ...\n", FuncName);
00812
00813 for (i = 0; i< SUMA_MAX_SURF_VIEWERS; ++i) {
00814 if (!SUMA_SetupSVforDOs (*Spec, SUMAg_DOv, SUMAg_N_DOv, &(SUMAg_SVv[i]))) {
00815 fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_SetupSVforDOs function.\n", FuncName);
00816 SUMA_RETURN(NOPE);
00817 }
00818 }
00819
00820 /* do not switch or redisplay yet, all you have is garbage for geometry ... */
00821 SUMA_free(Spec); Spec = NULL;
00822
00823 /* switch viewer 0 to the group in question */
00824 if (!sv) sv = &(SUMAg_SVv[0]);
00825 if (!SUMA_SwitchGroups (sv, SO->Group)) {
00826 SUMA_SL_Err("Failed to switch groups!");
00827 SUMA_RETURN(NOPE);
00828 }
00829 if ((i = SUMA_WhichState(SO->State, sv, sv->CurGroupName)) < 0) {
00830 SUMA_SL_Err("Failed to find state!");
00831 SUMA_RETURN(NOPE);
00832 } else {
00833 if (!SUMA_SwitchState(SUMAg_DOv, SUMAg_N_DOv, sv, i, sv->CurGroupName)) {
00834 SUMA_SL_Err("Failed to switch states!");
00835 SUMA_RETURN(NOPE);
00836 }
00837 }
00838
00839 /* do we need to notify AFNI ? */
00840 if (NI_get_attribute(nel, "Send2Afni")) {
00841 SUMA_LH("Attempting to talk to AFNI");
00842 if (!SO->VolPar) {
00843 SUMA_SL_Err("Have no VolPar, cannot send to AFNI!\nCommand ignored.");
00844 } else {
00845 if (!SUMAg_CF->Connected_v[SUMA_AFNI_STREAM_INDEX]) { /* need to send a toggle request */
00846 if (LocalHead) fprintf(SUMA_STDERR, "%s: Sending talk request...\n", FuncName);
00847 if (!list) list = SUMA_CreateList();
00848 SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_ToggleConnected, SES_SumaFromAny, sv);
00849 if (!SUMA_Engine (&list)) {
00850 fprintf(SUMA_STDERR, "Warning %s: SUMA_Engine call failed.\nContinuing...", FuncName);
00851 }
00852 } else {
00853 SUMA_LH("Looks like they're talking already");
00854 }
00855 /* now send the surface */
00856 SUMA_LH("Now trying to send surface");
00857 if (!SUMAg_CF->Connected_v[SUMA_AFNI_STREAM_INDEX]) {
00858 fprintf(SUMA_STDERR, "Warning %s: Failed to open connection.\nContinuing...", FuncName);
00859 } else {
00860 SUMA_LH("Making Call");
00861 if (!list) list = SUMA_CreateList();
00862 ED = SUMA_InitializeEngineListData (SE_SetAfniThisSurf);
00863 if (!( Elm = SUMA_RegisterEngineListCommand ( list, ED,
00864 SEF_cp, (void *)SO->idcode_str,
00865 SES_Suma, NULL, NOPE,
00866 SEI_Tail, NULL ))) {
00867 fprintf(SUMA_STDERR,"Error %s: Failed to register command\nIgnoring ...", FuncName);
00868 }else {
00869 int ti= 0;
00870 SUMA_RegisterEngineListCommand ( list, ED,
00871 SEF_s, (void *)("NodeList, FaceSetList, NodeNormList"),
00872 SES_Suma, NULL, NOPE,
00873 SEI_In, Elm );
00874 SUMA_RegisterEngineListCommand ( list, ED,
00875 SEF_i, (void *)&ti, /* 0, be quiet about it */
00876 SES_Suma, NULL, NOPE,
00877 SEI_In, Elm );
00878 if (!SUMA_Engine (&list)) {
00879 fprintf(SUMA_STDERR, "Warning %s: SUMA_Engine call failed.\nContinuing...", FuncName);
00880 }
00881 }
00882 }
00883 }
00884 } else {
00885 SUMA_LH("No talking to AFNI requested.");
00886 }
00887 /* don't free nel, it's freed later on */
00888 SUMA_RETURN(YUP) ;
00889 } /* PrepNewSurface */
00890
00891 /* NewNode_XYZ NOW OBSOLETE, see comment for NewMesh_IJK*/
00892 if( strcmp(nel->name,"NewNode_XYZ") == 0) {/* NewNode_XYZ */
00893 SUMA_SL_Err("Obsolete element, please use SUMA_SurfaceObject element instead");
00894 SUMA_RETURN(NOPE);
00895 if( nel->vec_len < 1 || nel->vec_filled < 1) { /* empty element? */
00896 fprintf(SUMA_STDERR,"%s: Empty NewNode_XYZ\n", FuncName);
00897 SUMA_RETURN(NOPE);
00898 }else {
00899 if( nel->vec_num != 1 || nel->vec_typ[0] != NI_FLOAT) {
00900 fprintf(SUMA_STDERR,"%s: NewNode_XYZ Bad format\n", FuncName);
00901 SUMA_RETURN(NOPE);
00902 }
00903 }
00904 /* show me nel */
00905 /* if (LocalHead) SUMA_nel_stdout (nel); */
00906
00907 /* look for the surface idcode */
00908 nel_surfidcode = NI_get_attribute(nel, "surface_idcode");
00909 if (SUMA_IS_EMPTY_STR_ATTR(nel_surfidcode)) nel_surfidcode = NI_get_attribute(nel, "Parent_ID");
00910 if (SUMA_IS_EMPTY_STR_ATTR(nel_surfidcode)) {
00911 fprintf(SUMA_STDERR,"Error %s: surface_idcode missing in nel (%s).\n", FuncName, nel->name);
00912 SUMA_RETURN(NOPE);
00913 }
00914
00915 SO = SUMA_findSOp_inDOv (nel_surfidcode, SUMAg_DOv, SUMAg_N_DOv);
00916 if (!SO) {
00917 fprintf(SUMA_STDERR,"Error %s:%s: nel idcode is not found in DOv.\n", FuncName, nel->name);
00918 SUMA_RETURN(NOPE);
00919 }
00920
00921 /* now copy the new node coordinates over the old ones */
00922 if (nel->vec_len != SO->N_Node * 3) {
00923 fprintf(SUMA_STDERR,"Error %s:\nExpected %d * 3 = %d values, found %d\n",
00924 FuncName, SO->N_Node, SO->N_Node * 3, nel->vec_len);
00925 SUMA_RETURN(NOPE);
00926 }
00927
00928 XYZ = (float *)nel->vec[0];
00929 for (i=0; i < nel->vec_len; ++i) SO->NodeList[i] = XYZ[i];
00930
00931 /* don't free nel, it's freed later on */
00932 SUMA_RETURN(YUP) ;
00933 } /* NewNode_XYZ */
00934
00935 /* Node_XYZ */
00936 if( strcmp(nel->name,"Node_XYZ") == 0) {/* Node_XYZ */
00937 if( nel->vec_len < 1 || nel->vec_filled < 1) { /* empty element? */
00938 fprintf(SUMA_STDERR,"%s: Empty Node_XYZ\n", FuncName);
00939 SUMA_RETURN(NOPE);
00940 }else {
00941 if( nel->vec_num != 1 || nel->vec_typ[0] != NI_FLOAT) {
00942 fprintf(SUMA_STDERR,"%s: Node_XYZ Bad format\n", FuncName);
00943 SUMA_RETURN(NOPE);
00944 }
00945 }
00946 /* show me nel */
00947 /* if (LocalHead) SUMA_nel_stdout (nel); */
00948
00949 /* look for the surface idcode */
00950 nel_surfidcode = NI_get_attribute(nel, "surface_idcode");
00951 if (SUMA_IS_EMPTY_STR_ATTR(nel_surfidcode)) nel_surfidcode = NI_get_attribute(nel, "Parent_ID");
00952 if (SUMA_IS_EMPTY_STR_ATTR(nel_surfidcode)) {
00953 fprintf(SUMA_STDERR,"Error %s: surface_idcode missing in nel (%s).\n", FuncName, nel->name);
00954 SUMA_RETURN(NOPE);
00955 }
00956
00957 SO = SUMA_findSOp_inDOv (nel_surfidcode, SUMAg_DOv, SUMAg_N_DOv);
00958 if (!SO) {
00959 fprintf(SUMA_STDERR,"Error %s:%s: nel idcode is not found in DOv.\n", FuncName, nel->name);
00960 SUMA_RETURN(NOPE);
00961 }
00962
00963 /* now copy the new node coordinates over the old ones */
00964 if (nel->vec_len != SO->N_Node * 3) {
00965 fprintf(SUMA_STDERR,"Error %s:\nExpected %d * 3 = %d values, found %d\n",
00966 FuncName, SO->N_Node, SO->N_Node * 3, nel->vec_len);
00967 SUMA_RETURN(NOPE);
00968 }
00969
00970 XYZ = (float *)nel->vec[0];
00971 for (i=0; i < nel->vec_len; ++i) SO->NodeList[i] = XYZ[i];
00972
00973 /* must recompute normals */
00974 SUMA_RECOMPUTE_NORMALS(SO);
00975
00976 /* file a redisplay request */
00977 if (LocalHead) fprintf(SUMA_STDERR, "%s: Redisplaying all visible...\n", FuncName);
00978 if (!list) list = SUMA_CreateList();
00979 SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_Redisplay_AllVisible, SES_SumaFromAny, sv);
00980 if (NI_get_attribute(nel, "Send2Afni")) {
00981 if (SUMAg_CF->Connected_v[SUMA_AFNI_STREAM_INDEX]) {
00982 SUMA_LH("Putting request for sending to afni ...");
00983 ED = SUMA_InitializeEngineListData (SE_SetAfniThisSurf);
00984 if (!( Elm = SUMA_RegisterEngineListCommand ( list, ED,
00985 SEF_cp, (void *)SO->idcode_str,
00986 SES_Suma, NULL, NOPE,
00987 SEI_Tail, NULL ))) {
00988 fprintf(SUMA_STDERR,"Error %s: Failed to register command\n", FuncName);
00989 SUMA_RETURN(NOPE);
00990 }
00991
00992 /* You could save time and not send the NodeNormList but that means AFNI
00993 will end up with a bad set of normals for the final version of the surface
00994 not a good idea... */
00995 SUMA_RegisterEngineListCommand ( list, ED,
00996 SEF_s, (void *)("NodeList, NodeNormList"),
00997 SES_Suma, NULL, NOPE,
00998 SEI_In, Elm );
00999 { int ti = 0; /* keep it quiet */
01000 SUMA_RegisterEngineListCommand ( list, ED,
01001 SEF_i, (void *)&ti,
01002 SES_Suma, NULL, NOPE,
01003 SEI_In, Elm );
01004 }
01005 } else {
01006 if (LocalHead) {
01007 SUMA_SL_Note("Cannot send surface to afni, no connection established");
01008 }
01009 }
01010 }
01011
01012 if (!SUMA_Engine (&list)) {
01013 fprintf(SUMA_STDERR, "Error %s: SUMA_Engine call failed.\n", FuncName);
01014 SUMA_RETURN(NOPE);
01015 }
01016
01017 /* don't free nel, it's freed later on */
01018 SUMA_RETURN(YUP) ;
01019
01020
01021 }/* Node_XYZ */
01022
01023 /* SUMA_irgba Node colors */
01024 if( strcmp(nel->name,"SUMA_irgba") == 0 || strcmp(nel->name,"Node_RGBAb") == 0) {/* SUMA_irgba */
01025 if( nel->vec_len < 1 || nel->vec_filled < 1) { /* empty element? */
01026 fprintf(SUMA_STDERR,"%s: Empty SUMA_irgba.\n", FuncName);
01027 Empty_irgba = YUP;
01028 }else {
01029 if( nel->vec_num != 5 || nel->vec_typ[0] != NI_INT || nel->vec_typ[1] != NI_BYTE || nel->vec_typ[2] != NI_BYTE || nel->vec_typ[3] != NI_BYTE) {
01030 fprintf(SUMA_STDERR,"%s: SUMA_irgba Bad format\n", FuncName);
01031 SUMA_RETURN(NOPE);
01032 }
01033 }
01034 #if SUMA_SUMA_NIML_DEBUG
01035 fprintf(SUMA_STDERR,"Warning %s:\nSleeping ONLY ...\n", FuncName);
01036 NI_sleep(200);
01037 SUMA_RETURN(YUP);
01038
01039
01040 if (0) { /* At times, I found the value in nel->vec[0] to be corrupted, use this to check on it */
01041 int *ibad;
01042 ibad = (int *)nel->vec[0];
01043 fprintf (SUMA_STDERR,"ibad[0] = %d\n", ibad[0]);
01044 }
01045 #endif
01046
01047 /* show me nel */
01048 /* if (LocalHead) SUMA_nel_stdout (nel); */
01049
01050 /* look for the surface idcode */
01051 nel_surfidcode = NI_get_attribute(nel, "surface_idcode");
01052 if (SUMA_IS_EMPTY_STR_ATTR(nel_surfidcode)) nel_surfidcode = NI_get_attribute(nel, "Parent_ID");
01053 if (SUMA_IS_EMPTY_STR_ATTR(nel_surfidcode)) {
01054 fprintf(SUMA_STDERR,"Error %s: surface_idcode missing in nel (%s).\n", FuncName, nel->name);
01055 SUMA_RETURN(NOPE);
01056 }
01057
01058 SO = SUMA_findSOp_inDOv (nel_surfidcode, SUMAg_DOv, SUMAg_N_DOv);
01059 if (!SO) {
01060 fprintf(SUMA_STDERR,"Error %s:%s: nel idcode is not found in DOv.\n", FuncName, nel->name);
01061 SUMA_RETURN(NOPE);
01062 }
01063
01064 /* store the node colors */
01065 /* create a color overlay plane */
01066 /* you could create an overlay plane with partial node coverage but you'd have to clean up and SUMA_reallocate
01067 with each new data sent since the number of colored nodes will change. So I'll allocate for the entire node list
01068 for the FuncAfni_0 color plane although only some values will be used*/
01069
01070 sopd.Type = SOPT_ibbb;
01071 sopd.Source = SES_Afni;
01072 sopd.GlobalOpacity = SUMA_AFNI_COLORPLANE_OPACITY;
01073 sopd.isBackGrnd = NOPE;
01074 sopd.Show = YUP;
01075 /* dim colors from maximum intensity to preserve surface shape highlights,
01076 division by is no longer necessary.
01077 */
01078 sopd.DimFact = SUMA_DIM_AFNI_COLOR_FACTOR;
01079 if (!Empty_irgba) {
01080 sopd.i = (void *)nel->vec[0];
01081 sopd.r = (void *)nel->vec[1];
01082 sopd.g = (void *)nel->vec[2];
01083 sopd.b = (void *)nel->vec[3];
01084 sopd.a = NULL;
01085 sopd.N = nel->vec_len;
01086 } else {
01087 sopd.i = sopd.r = sopd.g = sopd.b = sopd.a = NULL;
01088 sopd.N = 0;
01089 }
01090
01091 if (!SUMA_iRGB_to_OverlayPointer (SO, "FuncAfni_0", &sopd, &OverInd, SUMAg_DOv, SUMAg_N_DOv, SUMAg_CF->DsetList)) {
01092 SUMA_SLP_Err("Failed to fetch or create overlay pointer.");
01093 SUMA_RETURN(NOPE);
01094 }
01095
01096
01097 /* register a color remix request */
01098 if (LocalHead) fprintf(SUMA_STDERR, "%s: Setting Remix Flag for all related surfaces. ...\n", FuncName);
01099 if(!SUMA_SetRemixFlag (SO->idcode_str, SUMAg_SVv, SUMAg_N_SVv)) {
01100 fprintf (SUMA_STDERR,"Error %s: Failed in SUMA_SetRemixFlag.\n", FuncName);
01101 SUMA_RETURN(NOPE);
01102 }
01103
01104 /* file a redisplay request */
01105 if (LocalHead) fprintf(SUMA_STDERR, "%s: Redisplaying all visible...\n", FuncName);
01106 if (!list) list = SUMA_CreateList();
01107 if (strcmp(nel->name,"SUMA_irgba") == 0) {
01108 /* call from AFNI */
01109 SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_Redisplay_AllVisible, SES_SumaFromAfni, sv);
01110 } else {
01111 SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, SE_Redisplay_AllVisible, SES_SumaFromAny, sv);
01112 }
01113
01114 if (!SUMA_Engine (&list)) {
01115 fprintf(SUMA_STDERR, "Error %s: SUMA_Engine call failed.\n", FuncName);
01116 SUMA_RETURN(NOPE);
01117 }
01118
01119 /* don't free nel, it's freed later on */
01120 SUMA_RETURN(YUP) ;
01121
01122
01123 }/* SUMA_irgba */
01124
01125 /*** If here, then name of element didn't match anything ***/
01126
01127 fprintf(SUMA_STDERR,"Error %s: Unknown NIML input: %s\n", FuncName ,nel->name) ;
01128 SUMA_RETURN(NOPE) ;
01129 } /* end parse nels */ else { /* is group */
01130 ngr = (NI_group *) nini ;
01131
01132 if (strcmp(ngr->name,"SurfaceObject") == 0) { /* New Surface Object */
01133 SUMA_SurfaceObject *SOn=NULL;
01134
01135 SOn = SUMA_nimlSO2SO(ngr);
01136 if (!SOn) {
01137 SUMA_SL_Err("Failed to interpret SO");
01138 SUMA_RETURN(NOPE) ;
01139 }
01140
01141 SUMA_LH("Checking for new surface...");
01142 SO = SUMA_findSOp_inDOv (SOn->idcode_str, SUMAg_DOv, SUMAg_N_DOv);
01143 if (SO) {
01144 fprintf(SUMA_STDERR,"Warning %s: nel idcode was found in DOv.\nChecking for mesh compatibility\n", FuncName);
01145 if (SO->N_FaceSet * SO->FaceSetDim == SOn->N_FaceSet * SOn->FaceSetDim) {
01146 fprintf(SUMA_STDERR,"Note %s: Mesh dimensions match. New mesh will be adopted.\n", FuncName);
01147 } else {
01148 fprintf(SUMA_STDERR,"Error %s: Mesh dimensions mismatch.\n", FuncName);
01149 SUMA_RETURN(NOPE);
01150 }
01151 }
01152
01153 if (!SO) {
01154 SUMA_LH("A brand new surface.");
01155 BrandNew = YUP;
01156 } else {
01157 SUMA_LH("A refit of an existing surface.");
01158 BrandNew = NOPE;
01159 if (SOn->N_Node != SO->N_Node) {
01160 fprintf(SUMA_STDERR,"Error %s: Mismatch in number of nodes between new mesh and pre-existing one (%d vs %d)\n", FuncName, SO->N_Node, SO->N_Node);
01161 SUMA_RETURN(NOPE);
01162 }
01163 memcpy((void*)SO->FaceSetList, (void *)SOn->FaceSetList, SOn->N_FaceSet * SOn->FaceSetDim * sizeof(int)); /* this one's likely to be completely useless! */
01164 memcpy((void*)SO->NodeList, (void *)SOn->NodeList, SOn->N_Node * SOn->NodeDim * sizeof(float));
01165 /* swap VolPar */
01166 if (SOn->VolPar) {
01167 if (SO->VolPar) SUMA_Free_VolPar(SO->VolPar);
01168 SO->VolPar = SOn->VolPar;
01169 SOn->VolPar = NULL;
01170 }
01171 SUMA_Free_Surface_Object(SOn); SOn = NULL; /* alas, not needed no more.
01172 Perhaps you should consider eliminating SO's EdgeLists, area vectors and the like,
01173 You should also perhaps update VolPar with SOn's... */
01174 }
01175
01176 /* add this surface to DOv */
01177 if (BrandNew) {
01178 if (!SUMA_AddDO(SUMAg_DOv, &(SUMAg_N_DOv), (void *)SOn, SO_type, SUMA_LOCAL)) {
01179 fprintf(SUMA_STDERR,"Error %s: Error Adding DO\n", FuncName);
01180 SUMA_RETURN(NOPE);
01181 }
01182 }
01183
01184 /* don't free nel, it's freed later on */
01185 SUMA_RETURN(YUP) ;
01186 }
01187
01188 /*** If here, then name of group didn't match anything ***/
01189
01190 fprintf(SUMA_STDERR,"Error %s: Unknown NIML input: %s\n", FuncName ,ngr->name) ;
01191 SUMA_RETURN(NOPE) ;
01192 }
01193 }
|
|
||||||||||||
|
Definition at line 1510 of file SUMA_niml.c. References SUMA_X_AllView::App, datap, num_workp, SUMA_ENTRY, SUMA_malloc, SUMA_realloc, SUMA_RETURNe, SUMA_workprocess(), workp, wpid, and SUMA_CommonFields::X. Referenced by SUMA_cmap_wid_postRedisplay(), SUMA_Engine(), SUMA_postRedisplay(), and SUMA_X_SurfaceViewer_Create().
01511 {
01512 static char FuncName[]={"SUMA_register_workproc"};
01513
01514 SUMA_ENTRY;
01515
01516 if( func == NULL ){
01517 fprintf(SUMA_STDERR,"Error %s: func=NULL on entry!\n", FuncName) ;
01518 SUMA_RETURNe;
01519 }
01520
01521 if( num_workp == 0 ){
01522 workp = (XtWorkProc *) SUMA_malloc( sizeof(XtWorkProc) ) ;
01523 datap = (XtPointer *) SUMA_malloc( sizeof(XtPointer) ) ;
01524 wpid = XtAppAddWorkProc(SUMAg_CF->X->App, SUMA_workprocess, NULL ) ;
01525 #ifdef WPDEBUG
01526 fprintf(stderr,"SUMA_register_workproc: wpid = %x\n",(int)wpid) ;
01527 #endif
01528 } else {
01529 workp = (XtWorkProc *) SUMA_realloc( workp, sizeof(XtWorkProc)*(num_workp+1) ) ;
01530 datap = (XtPointer*) SUMA_realloc( datap, sizeof(XtPointer) *(num_workp+1) ) ;
01531 }
01532
01533 workp[num_workp] = func ;
01534 datap[num_workp] = data ;
01535 num_workp++ ;
01536
01537 #ifdef WPDEBUG
01538 fprintf(stderr,"SUMA_register_workproc: have %d workprocs\n",num_workp) ;
01539 #endif
01540
01541 SUMA_RETURNe ;
01542 }
|
|
|
Definition at line 1593 of file SUMA_niml.c. References datap, num_workp, SUMA_ENTRY, SUMA_free, SUMA_RETURNe, workp, and wpid.
01594 {
01595 int ii , ngood ;
01596 static char FuncName[]={"SUMA_remove_workproc"};
01597
01598 SUMA_ENTRY;
01599
01600 if( func == NULL || num_workp == 0 ){
01601 fprintf(SUMA_STDERR,"Error %s: *** illegal parameters!\n", FuncName) ;
01602 SUMA_RETURNe ;
01603 }
01604
01605 if( num_workp < 1 ){
01606 #ifdef WPDEBUG
01607 fprintf(stderr,"SUMA_remove_workproc: No workprocs left\n") ;
01608 #endif
01609 XtRemoveWorkProc( wpid ) ;
01610 SUMA_free(workp) ; workp = NULL ; SUMA_free(datap) ; datap = NULL ;
01611 num_workp = 0 ;
01612 } else {
01613 for( ii=0 ; ii < num_workp ; ii++ ){
01614 if( func == workp[ii] ) { /* move last Workprocess to location of workprocess to be deleted */
01615 workp[ii] = workp[num_workp-1] ;
01616 datap[ii] = datap[num_workp-1] ;
01617 workp[num_workp-1] = NULL;
01618 num_workp--;
01619 }
01620
01621 #ifdef WPDEBUG
01622 fprintf(stderr,"SUMA_remove_workproc: %d workprocs left\n",ngood) ;
01623 #endif
01624 }
01625 }
01626
01627 SUMA_RETURNe ;
01628 }
|
|
||||||||||||
|
The difference between SUMA_remove_workproc2 and SUMA_remove_workproc is that the workprocess removed is identified not just by the function name but also the data pointer Definition at line 1548 of file SUMA_niml.c. References datap, LocalHead, num_workp, SUMA_Boolean, SUMA_ENTRY, SUMA_free, SUMA_RETURNe, workp, and wpid. Referenced by SUMA_ButtClose_pushed().
01549 {
01550 int ii , ngood ;
01551 static char FuncName[]={"SUMA_remove_workproc2"};
01552 SUMA_Boolean LocalHead = NOPE;
01553
01554 SUMA_ENTRY;
01555
01556 if (LocalHead) fprintf (SUMA_STDERR, "%s: func = %p, num_workp = %d\n", FuncName, func, num_workp);
01557
01558 if( func == NULL) {
01559 fprintf(SUMA_STDERR,"%s: *** illegal parameters!\n", FuncName) ;
01560 SUMA_RETURNe ;
01561 }
01562 if (num_workp == 0) {
01563 if (LocalHead) fprintf(SUMA_STDERR,"%s: Nothing to do.\n", FuncName) ;
01564 SUMA_RETURNe ;
01565 }
01566
01567 if( num_workp < 1 ){
01568 #ifdef WPDEBUG
01569 fprintf(SUMA_STDERR,"%s: No workprocs left\n", FuncName) ;
01570 #endif
01571 XtRemoveWorkProc( wpid ) ;
01572 SUMA_free(workp) ; workp = NULL ; SUMA_free(datap) ; datap = NULL ;
01573 num_workp = 0 ;
01574 } else {
01575 for( ii=0 ; ii < num_workp ; ii++ ){
01576 if( func == workp[ii] && data == datap[ii]) { /* move last Workprocess to location of workprocess to be deleted */
01577 workp[ii] = workp[num_workp-1] ;
01578 datap[ii] = datap[num_workp-1] ;
01579 workp[num_workp-1] = NULL;
01580 num_workp--;
01581 }
01582
01583 #ifdef WPDEBUG
01584 fprintf(SUMA_STDERR,"%s: %d workprocs left\n", FuncName, ngood) ;
01585 #endif
01586 }
01587 }
01588
01589 SUMA_RETURNe ;
01590
01591 }
|
|
||||||||||||||||
|
Definition at line 3474 of file SUMA_niml.c. References DSET_NVALS, DSET_PREFIX, LocalHead, NI_BINARY_MODE, NI_free_element(), NI_set_attribute(), NI_write_element(), NI_write_procins(), SBFLAG_INDEX, SUMA_Boolean, SUMA_ENTRY, SUMA_LH, SUMA_RETURN, SUMA_SL_Warn, THD_dataset_to_niml(), THD_nimlize_dsetatr(), and THD_subbrick_to_niml(). Referenced by SUMA_SendToAfni().
03475 {
03476 static char FuncName[]={"SUMA_SendDset_Afni"};
03477 NI_group *ngr = NULL;
03478 NI_element *nel = NULL;
03479 int iv;
03480 SUMA_Boolean LocalHead = NOPE;
03481
03482 SUMA_ENTRY;
03483
03484 if (!dset) {
03485 SUMA_SL_Warn("NULL dset, nothing to do");
03486 SUMA_RETURN(YUP);
03487 }
03488
03489 if (all == 1) {
03490 SUMA_LH("Sending all dset at once");
03491 ngr = THD_dataset_to_niml( dset ) ;
03492 NI_set_attribute( ngr , "AFNI_prefix" , DSET_PREFIX(dset) ) ;
03493 NI_write_element(ns, ngr, NI_BINARY_MODE);
03494 NI_free_element(ngr); ngr = NULL;
03495 SUMA_LH("Done.");
03496 } else {
03497 SUMA_SL_Warn("Sending one sub-brick at a time NOT TESTED IN SUMA YET");
03498 ngr = THD_nimlize_dsetatr( dset ) ; /* header only */
03499 NI_set_attribute( ngr , "AFNI_prefix" , DSET_PREFIX(dset) ) ;
03500 NI_write_procins( ns , "keep_reading" ) ;
03501 NI_write_element( ns, ngr, NI_BINARY_MODE ) ;
03502 NI_free_element( ngr ) ; ngr = NULL;
03503 for( iv=0 ; iv < DSET_NVALS(dset) ; iv++ ){
03504 nel = THD_subbrick_to_niml( dset , iv , SBFLAG_INDEX ) ;
03505 NI_write_element( ns , nel , NI_BINARY_MODE ) ;
03506 NI_free_element(nel) ; nel = NULL;
03507 }
03508 NI_write_procins( ns , "pause_reading" ) ; /* not necessary but tidy */
03509 }
03510
03511
03512 SUMA_RETURN(YUP);
03513 }
|
|
||||||||||||
|
sends a full surface to SUMA
Definition at line 2170 of file SUMA_niml.c. References SUMA_SurfaceObject::FaceSetList, SUMA_SurfaceObject::NodeList, SUMA_COMM_STRUCT::Send, SUMA_Boolean, SUMA_ENTRY, SUMA_Mesh_IJK2Mesh_IJK_nel(), SUMA_NEW_MESH_IJK, SUMA_NEW_NODE_XYZ, SUMA_NodeXYZ2NodeXYZ_nel(), SUMA_PREP_NEW_SURFACE, SUMA_RETURN, SUMA_SendToSuma(), SUMA_SL_Err, SUMA_SO2nimlSO(), SUMA_SURFACE_OBJECT, and SUMA_COMM_STRUCT::talk_suma.
02171 {
02172 static char FuncName[]={"SUMA_SendSumaNewSurface"};
02173 NI_group *ngr=NULL;
02174
02175 SUMA_ENTRY;
02176
02177 if (!SO || !cs) { SUMA_SL_Err("NULL surface or NULL cs"); SUMA_RETURN(NOPE); }
02178 if (!cs->Send || !cs->talk_suma) { SUMA_SL_Err("Nothing to do"); SUMA_RETURN(NOPE); }
02179
02180
02181
02182 if (0) {
02183 /* send the mesh since this is a new surface */
02184 if (!SUMA_SendToSuma (SO, cs, (void *)SO->FaceSetList, SUMA_NEW_MESH_IJK, 1)) {
02185 SUMA_SL_Err("Failed to initialize SUMA_SendToSuma");
02186 cs->Send = NOPE;
02187 cs->talk_suma = NOPE;
02188 SUMA_RETURN(NOPE);
02189 }
02190 /* now send the coordinates of the new surface */
02191 if (!SUMA_SendToSuma (SO, cs, (void *)SO->NodeList, SUMA_NEW_NODE_XYZ, 1)) {
02192 SUMA_SL_Err("Failed to initialize SUMA_SendToSuma");
02193 cs->Send = NOPE;
02194 cs->talk_suma = NOPE;
02195 SUMA_RETURN(NOPE);
02196 }
02197 /* now send the command to register the new surface with viewers*/
02198 if (!SUMA_SendToSuma (SO, cs, NULL, SUMA_PREP_NEW_SURFACE, 1)) {
02199 SUMA_SL_Err("Failed to initialize SUMA_SendToSuma");
02200 cs->Send = NOPE;
02201 cs->talk_suma = NOPE;
02202 SUMA_RETURN(NOPE);
02203 }
02204 /* now manually clean up the function that created the new surface.
02205 last SUMA_SendToSuma call will only clean up the dtype that was being sent last.
02206 SUMA_SendToSuma can only clean when the same dtype is being sent. THAT NEEDS TO BE FIXED, perhaps send
02207 a flag to indicate how many objects you intend to send of any type. If it is one object
02208 then SendToSuma will do cleanup automatically without hangup ...*/
02209 SUMA_Mesh_IJK2Mesh_IJK_nel (SO, NULL, YUP, SUMA_NEW_MESH_IJK);
02210 SUMA_NodeXYZ2NodeXYZ_nel (SO, NULL, YUP, SUMA_NEW_NODE_XYZ);
02211 } else {
02212 /* the new way */
02213 ngr = SUMA_SO2nimlSO(SO, "NodeList, FaceSetList, VolPar", 1);
02214 if (!ngr) {
02215 SUMA_SL_Err("Failed to create surface");
02216 cs->Send = NOPE;
02217 cs->talk_suma = NOPE;
02218 SUMA_RETURN(NOPE);
02219 }
02220 /* now send the command to feed the new surface to suma*/
02221 if (!SUMA_SendToSuma (SO, cs, (void*)ngr, SUMA_SURFACE_OBJECT, 1)) {
02222 SUMA_SL_Err("Failed to initialize SUMA_SendToSuma");
02223 cs->Send = NOPE;
02224 cs->talk_suma = NOPE;
02225 SUMA_RETURN(NOPE);
02226 }
02227
02228 /* now send the command to register the new surface with viewers*/
02229 if (!SUMA_SendToSuma (SO, cs, NULL, SUMA_PREP_NEW_SURFACE, 1)) {
02230 SUMA_SL_Err("Failed to initialize SUMA_SendToSuma");
02231 cs->Send = NOPE;
02232 cs->talk_suma = NOPE;
02233 SUMA_RETURN(NOPE);
02234 }
02235 }
02236
02237 SUMA_RETURN(YUP);
02238 }
|
|
||||||||||||||||
|
Function to handle send data elements to AFNI.
Definition at line 3376 of file SUMA_niml.c. References SUMA_COMM_STRUCT::afni_GoneBad, SUMA_COMM_STRUCT::afni_host_name, SUMA_COMM_STRUCT::afni_istream, SUMA_COMM_STRUCT::afni_Send, LocalHead, NI_stream_close(), NI_stream_goodcheck(), SUMA_CommonFields::ns_flags_v, SUMA_CommonFields::ns_v, SUMA_Assign_HostName(), SUMA_Boolean, SUMA_ENTRY, SUMA_LH, SUMA_niml_call(), SUMA_RETURN, SUMA_SendDset_Afni(), SUMA_SL_Err, SUMA_SL_Warn, SUMA_CommonFields::TrackingId_v, and tt.
03377 {
03378 static char FuncName[]={"SUMA_SendToAfni"};
03379 static float etm = 0.0;
03380 static int i_in = 0;
03381 char stmp[500];
03382 struct timeval tt;
03383 NI_element *nel=NULL;
03384 float *f=NULL;
03385 int n=-1, WaitClose, WaitMax, *ip = NULL;
03386 float wtm;
03387 SUMA_Boolean good = YUP;
03388 SUMA_Boolean LocalHead = NOPE;
03389
03390 SUMA_ENTRY;
03391
03392
03393 if (action == 0) { /* initialization of connection */
03394
03395 SUMA_LH("Setting up for communication with AFNI ...");
03396 cs->afni_Send = YUP;
03397 if(!SUMA_Assign_HostName (SUMAg_CF, cs->afni_host_name, cs->afni_istream)) {
03398 fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_Assign_HostName", FuncName);
03399 exit (1);
03400 }
03401 if (!SUMA_niml_call (SUMAg_CF, cs->afni_istream, NOPE)) {
03402 SUMA_SL_Err("Failed in SUMA_niml_call");
03403 /* connection flag is reset in SUMA_niml_call */
03404 cs->afni_Send = NOPE;
03405 SUMA_RETURN(NOPE);
03406 }
03407
03408 /* no tracking for talking to AFNI */
03409
03410 /* here is where you would start the workprocess for this program
03411 But since communication is one way, then forget about it */
03412 ++i_in;
03413 SUMA_RETURN(YUP);
03414 }
03415
03416 if (action == 1) { /* action == 1, send data mode */
03417 if (!i_in) {
03418 SUMA_SL_Err("You must call SUMA_SendToAfni with action 0 before action 1.\nNo Communcation cleanup done.");
03419 cs->afni_Send = NOPE;
03420 SUMA_RETURN(NOPE);
03421 }
03422
03423 SUMA_LH("Creating nel and sending it");
03424
03425 /* make sure stream is till OK */
03426 if (NI_stream_goodcheck ( SUMAg_CF->ns_v[cs->afni_istream] , 1 ) < 0) {
03427 cs->afni_GoneBad = YUP;
03428 SUMA_SL_Warn("Communication stream with afni gone bad.\nShutting down communication.");
03429 cs->afni_Send = NOPE;
03430 SUMA_RETURN(YUP); /* returning without error since program should continue */
03431 }
03432
03433 if (!SUMA_SendDset_Afni( SUMAg_CF->ns_v[cs->afni_istream], (THD_3dim_dataset *)data, 1)) {
03434 SUMA_SL_Err("Failed to send dset");
03435 cs->afni_Send = NOPE;
03436 SUMA_RETURN(NOPE);
03437 }
03438
03439 ++i_in;
03440 SUMA_RETURN(YUP);
03441 }/* action == 1 */
03442
03443 if (action == 2) {
03444 if (i_in < 2) {
03445 SUMA_SL_Err("You must call SUMA_SendToAfni with action 0 and 1 before action 2.\nNo Communcation cleanup done.");
03446 cs->afni_Send = NOPE;
03447 SUMA_RETURN(NOPE);
03448 }
03449 /* reset static variables */
03450 i_in = 0;
03451 etm = 0.0;
03452
03453 /* now close the stream*/
03454 if (cs->afni_Send && !cs->afni_GoneBad) {
03455 SUMA_LH("Cleanup of nel producing functions...");
03456
03457 NI_stream_close(SUMAg_CF->ns_v[cs->afni_istream]);
03458 SUMAg_CF->ns_v[cs->afni_istream] = NULL;
03459 SUMAg_CF->ns_flags_v[cs->afni_istream] = 0;
03460 SUMAg_CF->TrackingId_v[cs->afni_istream] = 0;
03461 cs->afni_Send = NOPE;
03462 cs->afni_GoneBad = NOPE;
03463 cs->afni_istream = -1;
03464 }
03465
03466 SUMA_RETURN(YUP);
03467 }
03468
03469 /* should not get here */
03470 SUMA_SL_Err("Flow error.\nThis should not be");
03471 SUMA_RETURN(NOPE);
03472 }
|
|
||||||||||||||||||||||||
|
Function to handle send data elements to AFNI.
Definition at line 3039 of file SUMA_niml.c. References SUMA_COMM_STRUCT::comm_NI_mode, SUMA_VOLPAR::dirname, SUMA_COMM_STRUCT::ElInd, SUMA_COMM_STRUCT::Feed2Afni, SUMA_VOLPAR::filecode, SUMA_COMM_STRUCT::GoneBad, SUMA_SurfaceObject::idcode_str, SUMA_COMM_STRUCT::istream, SUMA_COMM_STRUCT::kth, LocalHead, SUMA_SurfaceObject::N_FaceSet, SUMA_SurfaceObject::N_Node, SUMA_COMM_STRUCT::nelps, NI_free_element(), NI_HEADERSHARP_FLAG, NI_new_data_element(), NI_set_attribute(), NI_sleep(), NI_stream_close(), NI_stream_goodcheck(), NI_stream_open(), NI_TEXT_MODE, NI_write_element(), SUMA_CommonFields::NimlStream_v, SUMA_CommonFields::ns_flags_v, SUMA_CommonFields::ns_v, SUMA_COMM_STRUCT::Send, SUMA_append_replace_string(), SUMA_Assign_HostName(), SUMA_Boolean, SUMA_DSET_TYPE, SUMA_Dset_Type_Name(), SUMA_ENTRY, SUMA_etime(), SUMA_free, SUMA_COMM_STRUCT::suma_host_name, SUMA_LH, SUMA_MESH_IJK, SUMA_Mesh_IJK2Mesh_IJK_nel(), SUMA_NEW_MESH_IJK, SUMA_NEW_NODE_XYZ, SUMA_niml_call(), SUMA_NODE_RGBAb, SUMA_NODE_XYZ, SUMA_NodeVal2irgba_nel(), SUMA_NodeXYZ2NodeXYZ_nel(), SUMA_PREP_NEW_SURFACE, SUMA_RETURN, SUMA_SEND_TO_SUMA_FUNC_CLEANUP, SUMA_SL_Err, SUMA_SL_Warn, SUMA_SURFACE_OBJECT, SUMA_COMM_STRUCT::TrackID, SUMA_CommonFields::TrackingId_v, tt, and SUMA_SurfaceObject::VolPar. Referenced by SUMA_AreaDiff(), SUMA_Chung_Smooth(), SUMA_EquateSurfaceSize(), SUMA_NN_GeomSmooth(), SUMA_Offset_GeomSmooth(), SUMA_ProjectSurfaceToSphere(), SUMA_Reposition_Touchup(), SUMA_SendSumaNewSurface(), SUMA_SkullMask(), SUMA_StretchToFitLeCerveau(), SUMA_Taubin_Smooth(), and SUMA_VolDiff().
03040 {
03041 static char FuncName[]={"SUMA_SendToSuma"};
03042 static float etm = 0.0;
03043 static int i_in = 0;
03044 char stmp[500];
03045 struct timeval tt;
03046 NI_element *nel=NULL;
03047 NI_group *ngr = NULL;
03048 float *f=NULL;
03049 int n=-1, WaitClose, WaitMax, *ip = NULL;
03050 float wtm;
03051 SUMA_Boolean good = YUP;
03052 SUMA_Boolean LocalHead = NOPE;
03053
03054 SUMA_ENTRY;
03055
03056
03057 if (action == 0) { /* initialization of connection */
03058
03059 SUMA_LH("Setting up for communication with SUMA ...");
03060 cs->Send = YUP;
03061 if(!SUMA_Assign_HostName (SUMAg_CF, cs->suma_host_name, cs->istream)) {
03062 fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_Assign_HostName", FuncName);
03063 exit (1);
03064 }
03065 if (!SUMA_niml_call (SUMAg_CF, cs->istream, NOPE)) {
03066 SUMA_SL_Err("Failed in SUMA_niml_call");
03067 /* connection flag is reset in SUMA_niml_call */
03068 cs->Send = NOPE;
03069 SUMA_RETURN(NOPE);
03070 }
03071
03072 nel = NI_new_data_element("StartTracking", 0);
03073 cs->TrackID = 1; /* that's the index for StartTracking command */
03074 NI_set_attribute(nel,"ni_stream_name", SUMAg_CF->NimlStream_v[cs->istream]);
03075 sprintf(stmp, "%d", cs->TrackID);
03076 NI_set_attribute(nel,"Tracking_ID", stmp);
03077 if (NI_write_element( SUMAg_CF->ns_v[cs->istream] , nel, cs->comm_NI_mode ) < 0) {
03078 SUMA_SL_Err("Failed to start tracking.\nContinuing...");
03079 }
03080 if (nel) NI_free_element(nel); nel = NULL;
03081
03082 /* here is where you would start the workprocess for this program
03083 But since communication is one way, then forget about it */
03084 ++i_in;
03085 SUMA_RETURN(YUP);
03086 }
03087
03088 if (action == 1) { /* action == 1, send data mode */
03089 if (!i_in) {
03090 SUMA_SL_Err("You must call SUMA_SendToSuma with action 0 before action 1.\nNo Communcation cleanup done.");
03091 cs->Send = NOPE;
03092 SUMA_RETURN(NOPE);
03093 }
03094 if ((cs->ElInd[dtype] % cs->kth)) {
03095 if (LocalHead) fprintf(SUMA_STDERR,"%s: Skipping element %d of type %d\n", FuncName, cs->ElInd[dtype], dtype);
03096 ++cs->ElInd[dtype];
03097 SUMA_RETURN(YUP);
03098 }
03099 ++cs->ElInd[dtype];
03100 SUMA_LH("Creating nel and sending it");
03101 switch (dtype) {
03102 case SUMA_NODE_RGBAb:
03103 case SUMA_NODE_XYZ:
03104 case SUMA_NEW_NODE_XYZ:
03105 n = 3 * SO->N_Node;
03106 f = (float *)data;
03107 break;
03108 case SUMA_NEW_MESH_IJK:
03109 case SUMA_MESH_IJK:
03110 n = 3 * SO->N_FaceSet;
03111 ip = (int *)data;
03112 break;
03113 case SUMA_PREP_NEW_SURFACE:
03114 break;
03115 case SUMA_SURFACE_OBJECT:
03116 break;
03117 default:
03118 SUMA_SL_Err("Data type not supported.");
03119 cs->GoneBad = YUP;
03120 cs->Send = NOPE;
03121 SUMA_RETURN(NOPE);
03122 break;
03123 }
03124
03125 /* make sure stream is till OK */
03126 if (NI_stream_goodcheck ( SUMAg_CF->ns_v[cs->istream] , 1 ) < 0) {
03127 cs->GoneBad = YUP;
03128 SUMA_SL_Warn("Communication stream gone bad.\nShutting down communication.");
03129 cs->Send = NOPE;
03130 SUMA_SEND_TO_SUMA_FUNC_CLEANUP;
03131 SUMA_RETURN(YUP); /* returning without error since program should continue */
03132 }
03133
03134
03135 nel = NULL; ngr = NULL;
03136 switch (dtype) {
03137 case SUMA_NODE_RGBAb:
03138 /* colorize data */
03139 nel = SUMA_NodeVal2irgba_nel (SO, f, SO->idcode_str, 0);
03140 if (!nel) {
03141 SUMA_SL_Err("Failed in SUMA_NodeVal2irgba_nel.\nCommunication off.")
03142 cs->Send = NOPE;
03143 SUMA_RETURN(NOPE);
03144 }
03145 break;
03146 case SUMA_NODE_XYZ:
03147 case SUMA_NEW_NODE_XYZ:
03148 /* turn XYZ to nel */
03149 nel = SUMA_NodeXYZ2NodeXYZ_nel(SO, f, NOPE, dtype);
03150 if (!nel) {
03151 SUMA_SL_Err("Failed in SUMA_NodeXYZ2NodeXYZ_nel.\nCommunication off.")
03152 cs->Send = NOPE;
03153 SUMA_RETURN(NOPE);
03154 }
03155 if (cs->Feed2Afni) NI_set_attribute(nel, "Send2Afni", "DoItBaby");
03156 break;
03157 case SUMA_MESH_IJK:
03158 case SUMA_NEW_MESH_IJK:
03159 /* turn IJK to nel */
03160 nel = SUMA_Mesh_IJK2Mesh_IJK_nel(SO, ip, NOPE, dtype);
03161 if (!nel) {
03162 SUMA_SL_Err("Failed in SUMA_Mesh_IJK2Mesh_IJK_nel.\nCommunication off.")
03163 cs->Send = NOPE;
03164 SUMA_RETURN(NOPE);
03165 }
03166 break;
03167 case SUMA_PREP_NEW_SURFACE:
03168 nel = NI_new_data_element(SUMA_Dset_Type_Name(dtype), 0);
03169 NI_set_attribute (nel, "surface_idcode", SO->idcode_str);
03170 if (SO->VolPar) {
03171 char *vppref=NULL;
03172 vppref = SUMA_append_replace_string(SO->VolPar->dirname, SO->VolPar->filecode, "/", 0);
03173 NI_set_attribute(nel, "VolParFilecode", vppref); SUMA_free(vppref); vppref = NULL;
03174 if (cs->Feed2Afni) NI_set_attribute(nel, "Send2Afni", "DoItBaby");
03175 }
03176 break;
03177 case SUMA_SURFACE_OBJECT:
03178 ngr = (NI_group *)data;
03179 break;
03180 default:
03181 SUMA_SL_Err("Unexpected element. Ignoring.");
03182 SUMA_RETURN(YUP);
03183 break;
03184 }
03185
03186
03187 if (!nel && !ngr) {/* !nel */
03188 SUMA_SL_Err("Flow error.");
03189 SUMA_RETURN(NOPE);
03190 }else {/* !nel */
03191 if (nel && ngr) {
03192 SUMA_SL_Err("Flow error.");
03193 SUMA_RETURN(NOPE);
03194 }
03195 /* add tracking */
03196 ++cs->TrackID;
03197 sprintf(stmp,"%d", cs->TrackID);
03198 if (nel) {
03199 NI_set_attribute (nel, "Tracking_ID", stmp);
03200 } else if (ngr) {
03201 NI_set_attribute (ngr, "Tracking_ID", stmp);
03202 }
03203 }
03204
03205 #if SUMA_SUMA_NIML_DEBUG /* writes every element to a text file for debugging ... */
03206 {
03207 NI_stream ns;
03208 /* Test writing results in asc, 1D format */
03209 if (LocalHead) fprintf(stderr," %s:-\nWriting ascii 1D ...\n"
03210 , FuncName);
03211 /* open the stream */
03212 sprintf(stmp, "file:niml_dbg_asc_TID_%d_.1D",cs->TrackID);
03213 ns = NI_stream_open( stmp , "w" ) ;
03214 if( ns == NULL ){
03215 fprintf (stderr,"Error %s:\nCan't open Test_write_asc_1D!"
03216 , FuncName);
03217 SUMA_RETURN(NOPE);
03218 }
03219
03220 if (nel) {
03221 /* write out the element */
03222 if (NI_write_element( ns , nel ,
03223 NI_TEXT_MODE | NI_HEADERSHARP_FLAG ) < 0) {
03224 fprintf (stderr,"Error %s:\nFailed in NI_write_element"
03225 , FuncName);
03226 SUMA_RETURN(NOPE);
03227 }
03228 } else if (ngr) {
03229 /* write out the element */
03230 if (NI_write_element( ns , ngr ,
03231 NI_TEXT_MODE | NI_HEADERSHARP_FLAG ) < 0) {
03232 fprintf (stderr,"Error %s:\nFailed in NI_write_element"
03233 , FuncName);
03234 SUMA_RETURN(NOPE);
03235 }
03236 }
03237
03238 /* close the stream */
03239 NI_stream_close( ns ) ;
03240 }
03241 #endif
03242
03243 if (cs->nelps > 0) { /* make sure that you are not sending elements too fast */
03244 if (!etm) etm = 100000.0; /* first pass, an eternity */
03245 else etm = SUMA_etime(&tt, 1);
03246 wtm = 1./cs->nelps - etm;
03247 if (wtm > 0) { /* wait */
03248 SUMA_LH("Sleeping to meet refresh rate...");
03249 NI_sleep((int)(wtm*1000));
03250 }
03251 }
03252
03253 /* send it to SUMA */
03254 if (LocalHead) fprintf (SUMA_STDOUT,"Sending element %d...\n", cs->TrackID);
03255 if (nel) {
03256 if (NI_write_element( SUMAg_CF->ns_v[cs->istream] , nel, cs->comm_NI_mode ) < 0) {
03257 SUMA_LH("Failed updating SUMA...");
03258 }
03259 } else if (ngr) {
03260 if (NI_write_element( SUMAg_CF->ns_v[cs->istream] , ngr, cs->comm_NI_mode ) < 0) {
03261 SUMA_LH("Failed updating SUMA...");
03262 }
03263 }
03264 if (LocalHead) {
03265 if (cs->nelps > 0) fprintf (SUMA_STDOUT," element %d sent (%f sec)\n", cs->TrackID, SUMA_etime(&tt, 1));
03266 else fprintf (SUMA_STDOUT," element %d sent \n", cs->TrackID);
03267 }
03268 if (nel) NI_free_element(nel) ; nel = NULL;
03269 if (ngr) NI_free_element(ngr) ; ngr = NULL;
03270
03271 if (cs->nelps > 0) SUMA_etime(&tt, 0); /* start the timer */
03272 ++i_in;
03273 SUMA_RETURN(YUP);
03274 }/* action == 1 */
03275
03276 if (action == 2) {
03277 if (i_in < 2) {
03278 SUMA_SL_Err("You must call SUMA_SendToSuma with action 0 and 1 before action 2.\nNo Communcation cleanup done.");
03279 cs->Send = NOPE;
03280 SUMA_RETURN(NOPE);
03281 }
03282 /* reset static variables */
03283 i_in = 0;
03284 etm = 0.0;
03285
03286 SUMA_SEND_TO_SUMA_FUNC_CLEANUP;
03287
03288 /* now close the stream*/
03289 if (cs->Send && !cs->GoneBad) {
03290 SUMA_LH("Cleanup of nel producing functions...");
03291 /* stop tracking */
03292 nel = NI_new_data_element("StopTracking", 0);
03293 NI_set_attribute(nel,"ni_stream_name", SUMAg_CF->NimlStream_v[cs->istream]);
03294
03295 if (NI_write_element( SUMAg_CF->ns_v[cs->istream] , nel, cs->comm_NI_mode ) < 0) {
03296 SUMA_SL_Err("Failed to stop tracking.\nContinuing...");
03297 }
03298 if (nel) NI_free_element(nel); nel = NULL;
03299
03300 /* tell suma you're done with that stream */
03301 nel = NI_new_data_element("CloseKillStream",0);
03302 if (!nel) {
03303 SUMA_SL_Err("Failed to create nel");
03304 exit(1);
03305 }
03306
03307 NI_set_attribute (nel, "ni_stream_name", SUMAg_CF->NimlStream_v[cs->istream]);
03308 if (NI_write_element( SUMAg_CF->ns_v[cs->istream] , nel, cs->comm_NI_mode ) < 0) {
03309 SUMA_LH("Failed updating SUMA...");
03310 }
03311 if (nel) NI_free_element(nel) ; nel = NULL;
03312
03313
03314 /* now wait till stream goes bad */
03315 good = YUP;
03316 WaitClose = 0;
03317 WaitMax = 5000;
03318 fprintf (SUMA_STDERR,"\nWaiting for SUMA to close stream .");
03319 while (good && WaitClose < WaitMax) {
03320 if (NI_stream_goodcheck(SUMAg_CF->ns_v[cs->istream], 1) <= 0) {
03321 good = NOPE;
03322 } else {
03323 SUMA_LH("Good Check OK. Sleeping for a second...");
03324 NI_sleep(1000);
03325 fprintf (SUMA_STDERR,".");
03326 WaitClose += 1000;
03327 }
03328 }
03329
03330 if (WaitClose >= WaitMax) {
03331 SUMA_SL_Warn("\nFailed to detect closed stream.\nClosing shop anyway...");
03332 }else{
03333 fprintf (SUMA_STDERR,"Done.\n");
03334 }
03335
03336 NI_stream_close(SUMAg_CF->ns_v[cs->istream]);
03337 SUMAg_CF->ns_v[cs->istream] = NULL;
03338 SUMAg_CF->ns_flags_v[cs->istream] = 0;
03339 SUMAg_CF->TrackingId_v[cs->istream] = 0;
03340 cs->Send = NOPE;
03341 cs->GoneBad = NOPE;
03342 cs->nelps = -1.0;
03343 cs->TrackID = 0;
03344 cs->istream = -1;
03345
03346
03347
03348 }
03349
03350 SUMA_RETURN(YUP);
03351 }
03352
03353 /* should not get here */
03354 SUMA_SL_Err("Flow error.\nThis should not be");
03355 SUMA_RETURN(NOPE);
03356 }
|
|
||||||||||||||||
|
A function to turn the VolPar structure to a nel, this one's a group
Definition at line 2671 of file SUMA_niml.c. References SUMA_VOLPAR::dirname, SUMA_VOLPAR::dx, SUMA_VOLPAR::dy, SUMA_VOLPAR::dz, SUMA_VOLPAR::filecode, SUMA_VOLPAR::Hand, i, SUMA_VOLPAR::idcode_str, SUMA_SurfaceObject::idcode_str, SUMA_VOLPAR::isanat, SUMA_SurfaceObject::Label, LocalHead, NI_set_attribute(), SUMA_VOLPAR::nx, SUMA_VOLPAR::ny, SUMA_VOLPAR::nz, SUMA_VOLPAR::prefix, SUMA_VOLPAR::ROTATE_CENTER_BASE, SUMA_VOLPAR::ROTATE_CENTER_OLD, SUMA_VOLPAR::ROTATE_MATVEC, SUMA_allow_nel_use(), SUMA_Boolean, SUMA_DSET_TYPE, SUMA_EMPTY_ATTR, SUMA_ENTRY, SUMA_NEW_ID, SUMA_NewNel(), SUMA_RETURN, SUMA_SL_Err, SUMA_SURFACE_VOLUME_PARENT, SUMA_VOLPAR::TAGALIGN_MATVEC, SUMA_VOLPAR::vol_idcode_date, SUMA_VOLPAR::vol_idcode_str, SUMA_VOLPAR::VOLREG_CENTER_BASE, SUMA_VOLPAR::VOLREG_CENTER_OLD, SUMA_VOLPAR::VOLREG_MATVEC, SUMA_VOLPAR::xorg, SUMA_VOLPAR::xxorient, SUMA_VOLPAR::yorg, SUMA_VOLPAR::yyorient, SUMA_VOLPAR::zorg, and SUMA_VOLPAR::zzorient. Referenced by SUMA_SO2nimlSO().
02672 {
02673 static char FuncName[]={"SUMA_SOVolPar2VolPar_nel"};
02674 NI_element *nel=NULL;
02675 int ibuf3[3], i;
02676 float fbuf3[3];
02677 char stmp[500];
02678 SUMA_Boolean LocalHead = NOPE;
02679
02680 SUMA_ENTRY;
02681
02682 if (dtype != SUMA_SURFACE_VOLUME_PARENT) {
02683 SUMA_SL_Err("Bad dtype for this function!");
02684 SUMA_RETURN(NULL);
02685 }
02686
02687 if (!VolPar) {
02688 SUMA_SL_Err("NULL VolPar");
02689 SUMA_RETURN(NULL);
02690 }
02691
02692
02693 if (!VolPar->idcode_str) { SUMA_NEW_ID(VolPar->idcode_str, NULL); }
02694
02695 /* Now create that data element and write it out */
02696 SUMA_allow_nel_use(1);
02697 nel = SUMA_NewNel ( dtype, /* one of SUMA_DSET_TYPE */
02698 SO->idcode_str, /* idcode of Domain Parent Surface*/
02699 NULL, /* idcode of geometry parent, not useful here*/
02700 0,
02701 NULL,
02702 VolPar->idcode_str);
02703 if (!nel) {
02704 fprintf (stderr,"Error %s:\nFailed in SUMA_NewNel", FuncName);
02705 SUMA_RETURN(NULL);
02706 }
02707
02708 if (SO->Label) {
02709 sprintf(stmp,"Volume parent of %s", SO->Label);
02710 NI_set_attribute(nel, "Object_Label", stmp);
02711 } else {
02712 NI_set_attribute(nel, "Object_Label", SUMA_EMPTY_ATTR);
02713 }
02714
02715 sprintf(stmp,"%d", VolPar->isanat);
02716 NI_set_attribute(nel, "isanat", stmp);
02717
02718 sprintf(stmp,"%d", VolPar->Hand);
02719 NI_set_attribute(nel, "axis_hand", stmp);
02720
02721 if (VolPar->prefix) NI_set_attribute(nel, "prefix", VolPar->prefix);
02722 else NI_set_attribute(nel, "prefix", SUMA_EMPTY_ATTR);
02723
02724 if (VolPar->filecode) NI_set_attribute(nel, "filecode", VolPar->filecode);
02725 else NI_set_attribute(nel, "filecode", SUMA_EMPTY_ATTR);
02726
02727 if (VolPar->dirname) NI_set_attribute(nel, "dirname", VolPar->dirname);
02728 else NI_set_attribute(nel, "dirname", SUMA_EMPTY_ATTR);
02729
02730 if (VolPar->vol_idcode_str) NI_set_attribute(nel, "vol_idcode_str", VolPar->vol_idcode_str);
02731 else NI_set_attribute(nel, "vol_idcode_str", SUMA_EMPTY_ATTR);
02732
02733 if (VolPar->vol_idcode_date) NI_set_attribute(nel, "vol_idcode_date", VolPar->vol_idcode_date);
02734 else NI_set_attribute(nel, "vol_idcode_date", SUMA_EMPTY_ATTR);
02735
02736 sprintf(stmp, "%d %d %d", VolPar->nx, VolPar->ny, VolPar->nz);
02737 NI_set_attribute(nel, "nxyz", stmp);
02738
02739 sprintf(stmp, "%d %d %d", VolPar->xxorient, VolPar->yyorient, VolPar->zzorient);
02740 NI_set_attribute(nel, "xyzorient", stmp);
02741
02742 sprintf(stmp, "%f %f %f", VolPar->dx, VolPar->dy, VolPar->dz);
02743 NI_set_attribute(nel, "dxyz", stmp);
02744
02745 sprintf(stmp, "%f %f %f", VolPar->xorg, VolPar->yorg, VolPar->zorg);
02746 NI_set_attribute(nel, "xyzorg", stmp);
02747
02748 if (VolPar->VOLREG_CENTER_OLD) {
02749 stmp[0] = '\0';
02750 for (i=0; i<3; ++i) sprintf(stmp,"%s %f", stmp, VolPar->VOLREG_CENTER_OLD[i]);
02751 NI_set_attribute(nel, "VOLREG_CENTER_OLD", stmp);
02752 }
02753 if (VolPar->VOLREG_CENTER_BASE) {
02754 stmp[0] = '\0';
02755 for (i=0; i<3; ++i) sprintf(stmp,"%s %f", stmp, VolPar->VOLREG_CENTER_BASE[i]);
02756 NI_set_attribute(nel, "VOLREG_CENTER_BASE", stmp);
02757 }
02758
02759 if (VolPar->VOLREG_MATVEC) {
02760 stmp[0] = '\0';
02761 for (i=0; i<12; ++i) sprintf(stmp,"%s %f", stmp, VolPar->VOLREG_MATVEC[i]);
02762 NI_set_attribute(nel, "VOLREG_MATVEC", stmp);
02763 }
02764
02765 if (VolPar->TAGALIGN_MATVEC) {
02766 stmp[0] = '\0';
02767 for (i=0; i<12; ++i) sprintf(stmp,"%s %f", stmp, VolPar->TAGALIGN_MATVEC[i]);
02768 NI_set_attribute(nel, "TAGALIGN_MATVEC", stmp);
02769 }
02770
02771 if (VolPar->ROTATE_MATVEC) {
02772 stmp[0] = '\0';
02773 for (i=0; i<12; ++i) sprintf(stmp,"%s %f", stmp, VolPar->ROTATE_MATVEC[i]);
02774 NI_set_attribute(nel, "ROTATE_MATVEC", stmp);
02775 }
02776
02777 if (VolPar->ROTATE_CENTER_OLD) {
02778 stmp[0] = '\0';
02779 for (i=0; i<3; ++i) sprintf(stmp,"%s %f", stmp, VolPar->ROTATE_CENTER_OLD[i]);
02780 NI_set_attribute(nel, "ROTATE_CENTER_OLD", stmp);
02781 }
02782 if (VolPar->ROTATE_CENTER_BASE) {
02783 stmp[0] = '\0';
02784 for (i=0; i<3; ++i) sprintf(stmp,"%s %f", stmp, VolPar->ROTATE_CENTER_BASE[i]);
02785 NI_set_attribute(nel, "ROTATE_CENTER_BASE", stmp);
02786 }
02787 SUMA_RETURN(nel);
02788 }
|
|
||||||||||||
|
the inverse of SUMA_SOVolPar2VolPar_nel
Definition at line 2553 of file SUMA_niml.c. References SUMA_VOLPAR::dirname, SUMA_VOLPAR::dx, SUMA_VOLPAR::dy, SUMA_VOLPAR::dz, SUMA_VOLPAR::filecode, SUMA_VOLPAR::Hand, SUMA_VOLPAR::idcode_str, SUMA_SurfaceObject::idcode_str, SUMA_VOLPAR::isanat, LocalHead, NI_element::name, NI_get_attribute(), SUMA_VOLPAR::nx, SUMA_VOLPAR::ny, SUMA_VOLPAR::nz, SUMA_VOLPAR::prefix, SUMA_VOLPAR::ROTATE_CENTER_BASE, SUMA_VOLPAR::ROTATE_CENTER_OLD, SUMA_VOLPAR::ROTATE_MATVEC, SUMA_Alloc_VolPar(), SUMA_Boolean, SUMA_copy_string(), SUMA_COPY_VEC, SUMA_DSET_TYPE, SUMA_Dset_Type(), SUMA_ENTRY, SUMA_IS_EMPTY_STR_ATTR, SUMA_malloc, SUMA_RETURN, SUMA_SL_Err, SUMA_StringToNum(), SUMA_SURFACE_VOLUME_PARENT, SUMA_VOLPAR::TAGALIGN_MATVEC, SUMA_VOLPAR::vol_idcode_date, SUMA_VOLPAR::vol_idcode_str, SUMA_SurfaceObject::VolPar, SUMA_VOLPAR::VOLREG_CENTER_BASE, SUMA_VOLPAR::VOLREG_CENTER_OLD, SUMA_VOLPAR::VOLREG_MATVEC, SUMA_VOLPAR::xorg, SUMA_VOLPAR::xxorient, SUMA_VOLPAR::yorg, SUMA_VOLPAR::yyorient, SUMA_VOLPAR::zorg, and SUMA_VOLPAR::zzorient. Referenced by SUMA_nimlSO2SO().
02554 {
02555 static char FuncName[]={"SUMA_VolPar_nel2SOVolPar"};
02556 char *tmp;
02557 float fv15[15];
02558 SUMA_DSET_TYPE dtype;
02559 SUMA_Boolean LocalHead = NOPE;
02560
02561 SUMA_ENTRY;
02562
02563 dtype = SUMA_Dset_Type(nel->name);
02564 if (dtype != SUMA_SURFACE_VOLUME_PARENT) {
02565 SUMA_SL_Err("Bad dtype for this function!");
02566 SUMA_RETURN(NOPE);
02567 }
02568
02569 if (SO->VolPar) { SUMA_SL_Err("SO->VolPar must be NULL here"); SUMA_RETURN(NOPE); }
02570 SO->VolPar = SUMA_Alloc_VolPar();
02571
02572 tmp = NI_get_attribute(nel, "Object_ID");
02573 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) SO->VolPar->idcode_str = SUMA_copy_string(tmp);
02574
02575 tmp = NI_get_attribute(nel, "Parent_ID");
02576 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) {
02577 if (strcmp(tmp, SO->idcode_str)) {
02578 SUMA_SL_Err("idcode of parent mismatch"); SUMA_RETURN(NOPE);
02579 }
02580 }
02581
02582 tmp = NI_get_attribute(nel, "isanat");
02583 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) SO->VolPar->isanat = atoi(tmp);
02584
02585 tmp = NI_get_attribute(nel, "axis_hand");
02586 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) SO->VolPar->Hand = atoi(tmp);
02587
02588 tmp = NI_get_attribute(nel, "prefix");
02589 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) SO->VolPar->prefix = SUMA_copy_string(tmp);
02590
02591 tmp = NI_get_attribute(nel, "filecode");
02592 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) SO->VolPar->filecode = SUMA_copy_string(tmp);
02593
02594 tmp = NI_get_attribute(nel, "dirname");
02595 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) SO->VolPar->dirname = SUMA_copy_string(tmp);
02596
02597 tmp = NI_get_attribute(nel, "vol_idcode_str");
02598 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) SO->VolPar->vol_idcode_str = SUMA_copy_string(tmp);
02599
02600 tmp = NI_get_attribute(nel, "vol_idcode_date");
02601 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) SO->VolPar->vol_idcode_date = SUMA_copy_string(tmp);
02602
02603 tmp = NI_get_attribute(nel, "nxyz");
02604 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) { SUMA_StringToNum(tmp, fv15, 3); SO->VolPar->nx = (int)fv15[0]; SO->VolPar->ny = (int)fv15[1]; SO->VolPar->nz = (int)fv15[2]; }
02605
02606 tmp = NI_get_attribute(nel, "xyzorient");
02607 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) { SUMA_StringToNum(tmp, fv15, 3); SO->VolPar->xxorient = (int)fv15[0]; SO->VolPar->yyorient = (int)fv15[1]; SO->VolPar->zzorient = (int)fv15[2]; }
02608
02609 tmp = NI_get_attribute(nel, "dxyz");
02610 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) { SUMA_StringToNum(tmp, fv15, 3); SO->VolPar->dx = fv15[0]; SO->VolPar->dy = fv15[1]; SO->VolPar->dz = fv15[2]; }
02611
02612 tmp = NI_get_attribute(nel, "xyzorg");
02613 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) { SUMA_StringToNum(tmp, fv15, 3); SO->VolPar->xorg = fv15[0]; SO->VolPar->yorg = fv15[1]; SO->VolPar->zorg = fv15[2]; }
02614
02615 tmp = NI_get_attribute(nel, "VOLREG_CENTER_OLD");
02616 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) {
02617 SUMA_StringToNum(tmp, fv15, 3);
02618 SO->VolPar->VOLREG_CENTER_OLD = (float*)SUMA_malloc(sizeof(float)*3);
02619 SUMA_COPY_VEC(fv15, SO->VolPar->VOLREG_CENTER_OLD, 2, float, float);
02620 }
02621
02622 tmp = NI_get_attribute(nel, "VOLREG_CENTER_BASE");
02623 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) {
02624 SUMA_StringToNum(tmp, fv15, 3);
02625 SO->VolPar->VOLREG_CENTER_BASE = (float*)SUMA_malloc(sizeof(float)*3);
02626 SUMA_COPY_VEC(fv15, SO->VolPar->VOLREG_CENTER_BASE, 2, float, float);
02627 }
02628
02629 tmp = NI_get_attribute(nel, "VOLREG_MATVEC");
02630 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) {
02631 SUMA_StringToNum(tmp, fv15, 12);
02632 SO->VolPar->VOLREG_MATVEC = (float*)SUMA_malloc(sizeof(float)*12);
02633 SUMA_COPY_VEC(fv15, SO->VolPar->VOLREG_MATVEC, 2, float, float);
02634 }
02635
02636 tmp = NI_get_attribute(nel, "TAGALIGN_MATVEC");
02637 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) {
02638 SUMA_StringToNum(tmp, fv15, 12);
02639 SO->VolPar->TAGALIGN_MATVEC = (float*)SUMA_malloc(sizeof(float)*12);
02640 SUMA_COPY_VEC(fv15, SO->VolPar->TAGALIGN_MATVEC, 2, float, float);
02641 }
02642
02643 tmp = NI_get_attribute(nel, "ROTATE_MATVEC");
02644 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) {
02645 SUMA_StringToNum(tmp, fv15, 12);
02646 SO->VolPar->ROTATE_MATVEC = (float*)SUMA_malloc(sizeof(float)*12);
02647 SUMA_COPY_VEC(fv15, SO->VolPar->ROTATE_MATVEC, 2, float, float);
02648 }
02649
02650 tmp = NI_get_attribute(nel, "ROTATE_CENTER_OLD");
02651 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) {
02652 SUMA_StringToNum(tmp, fv15, 3);
02653 SO->VolPar->ROTATE_CENTER_OLD = (float*)SUMA_malloc(sizeof(float)*3);
02654 SUMA_COPY_VEC(fv15, SO->VolPar->ROTATE_CENTER_OLD, 2, float, float);
02655 }
02656
02657 tmp = NI_get_attribute(nel, "ROTATE_CENTER_BASE");
02658 if (!SUMA_IS_EMPTY_STR_ATTR(tmp)) {
02659 SUMA_StringToNum(tmp, fv15, 3);
02660 SO->VolPar->ROTATE_CENTER_BASE = (float*)SUMA_malloc(sizeof(float)*3);
02661 SUMA_COPY_VEC(fv15, SO->VolPar->ROTATE_CENTER_BASE, 2, float, float);
02662 }
02663
02664 SUMA_RETURN(YUP);
02665 }
|
|
||||||||||||
|
Definition at line 217 of file SUMA_niml.c. References i, LocalHead, SUMA_CommonFields::NimlStream_v, SUMA_Boolean, SUMA_ENTRY, SUMA_MAX_STREAMS, and SUMA_RETURN. Referenced by SUMA_niml_hangup(), and SUMA_process_NIML_data().
00218 {
00219 static char FuncName[]={"SUMA_which_stream_index"};
00220 int i;
00221 SUMA_Boolean LocalHead = NOPE;
00222
00223 SUMA_ENTRY;
00224
00225 for (i=0; i < SUMA_MAX_STREAMS; ++i) {
00226 if (strcmp(nel_stream_name, cf->NimlStream_v[i]) == 0) SUMA_RETURN(i);
00227 }
00228
00229 SUMA_RETURN(-1);
00230 }
|
|
|
Definition at line 1630 of file SUMA_niml.c. References datap, num_workp, SUMA_ENTRY, SUMA_free, SUMA_RETURN, and workp. Referenced by SUMA_register_workproc().
01631 {
01632 static char FuncName[]={"SUMA_workprocess"};
01633 int ii , ngood ;
01634 Boolean done ;
01635
01636 if (SUMA_WORKPROC_IO_NOTIFY) {SUMA_ENTRY;}
01637
01638 #ifdef WPDEBUG
01639 { static int ncall=0 ;
01640 if( (ncall++) % 1000 == 0 )
01641 fprintf(stderr,"SUMA_workprocess: entry %d\n",ncall) ; }
01642 #endif
01643
01644 if( num_workp == 0 ) {
01645 if (SUMA_WORKPROC_IO_NOTIFY) {
01646 SUMA_RETURN(True) ;
01647 }
01648 else return(True);
01649 }
01650
01651 for( ii=0,ngood=0 ; ii < num_workp ; ii++ ){
01652 if( workp[ii] != NULL ){
01653 done = workp[ii]( datap[ii] ) ;
01654 if( done == True ) workp[ii] = NULL ;
01655 else ngood++ ;
01656 }
01657 }
01658
01659 if( ngood == 0 ){
01660 #ifdef WPDEBUG
01661 fprintf(stderr,"Found no workprocs left\n") ;
01662 #endif
01663 SUMA_free(workp) ; workp = NULL ; SUMA_free(datap) ; datap = NULL ;
01664 num_workp = 0 ;
01665 if (SUMA_WORKPROC_IO_NOTIFY) {
01666 SUMA_RETURN(True) ;
01667 }
01668 else return (True);
01669 }
01670
01671 if (SUMA_WORKPROC_IO_NOTIFY) {
01672 SUMA_RETURN(False) ;
01673 }
01674 else return(False);
01675 }
|
Variable Documentation
|
|
Definition at line 1505 of file SUMA_niml.c. Referenced by SUMA_register_workproc(), SUMA_remove_workproc(), SUMA_remove_workproc2(), and SUMA_workprocess(). |
|
|
Definition at line 1503 of file SUMA_niml.c. Referenced by SUMA_register_workproc(), SUMA_remove_workproc(), SUMA_remove_workproc2(), and SUMA_workprocess(). |
|
|
Flag to tell if NIML things are initialized. Definition at line 16 of file SUMA_niml.c. |
|
|
Global pointer to structure containing info common to all viewers Definition at line 8 of file SUMA_niml.c. |
|
|
Global pointer to Displayable Object structure vector Definition at line 7 of file SUMA_niml.c. |
|
|
Number of DOs stored in DOv Definition at line 6 of file SUMA_niml.c. Referenced by SUMA_makeNI_CrossHair(), and SUMA_process_NIML_data(). |
|
|
Number of SVs stored in SVv Definition at line 10 of file SUMA_niml.c. Referenced by SUMA_process_NIML_data(). |
|
|
Global pointer to the vector containing the various Surface Viewer Structures Definition at line 9 of file SUMA_niml.c. |
|
|
Definition at line 1504 of file SUMA_niml.c. Referenced by SUMA_register_workproc(), SUMA_remove_workproc(), SUMA_remove_workproc2(), and SUMA_workprocess(). |
|
|
Definition at line 1506 of file SUMA_niml.c. Referenced by SUMA_register_workproc(), SUMA_remove_workproc(), and SUMA_remove_workproc2(). |