Doxygen Source Code Documentation
SUMA_DOmanip.h File Reference
Go to the source code of this file.
Defines | |
| #define | SUMA_IS_DRAW_ROI_SWITCH_ROI_SHADED(Shaded) |
| SUMA_IS_DRAW_ROI_SWITCH_ROI_SHADED(Shaded) Shaded is YUP unless the Switch ROI window is currently open. | |
| #define | SUMA_IS_SWITCH_COL_PLANE_SHADED(SO, Shaded) |
| SUMA_IS_SWITCH_COL_PLANE_SHADED(SO, Shaded) Shaded is YUP unless the Switch Col plane window is currently open. | |
Functions | |
| float * | SUMA_IV_XYZextract (char *IV_filename, int *N_NodeList, int IncludeIndex) |
| int * | SUMA_IV_FaceSetsextract (char *IV_filename, int *N_FaceSetList) |
| SUMA_SURF_NORM | SUMA_SurfNorm (float *NodeList, int N_NodeList, int *FaceSetList, int N_FaceSetList) |
| SUMA_Boolean | SUMA_Free_Displayable_Object (SUMA_DO *dov) |
| SUMA_DO * | SUMA_Alloc_DisplayObject_Struct (int N) |
| SUMA_Boolean | SUMA_AddDO (SUMA_DO *dov, int *N_dov, void *op, SUMA_DO_Types DO_Type, SUMA_DO_CoordType DO_CoordType) |
| SUMA_Boolean | SUMA_RemoveDO (SUMA_DO *dov, int *N_dov, void *op, SUMA_Boolean Free_op) |
| Remove a displayable object from dov success = SUMA_RemoveDO(dov, N_dov, op, Free_op);. | |
| SUMA_Boolean | SUMA_UnRegisterDO (int dov_id, SUMA_SurfaceViewer *cSV) |
| SUMA_Boolean | SUMA_RegisterDO (int dov_id, SUMA_SurfaceViewer *cSV) |
| void | SUMA_Show_DOv (SUMA_DO *dov, int N_dov, FILE *Out) |
| int * | SUMA_GetDO_Type (SUMA_DO *dov, int N_dov, SUMA_DO_Types DO_Type, int *N) |
| SUMA_Boolean | SUMA_Free_Displayable_Object_Vect (SUMA_DO *dov, int N) |
| SUMA_MEMBER_FACE_SETS * | SUMA_MemberFaceSets (int Nind, int *FaceSetList, int nFr, int FaceDim, char *ownerid) |
| SUMA_Boolean | SUMA_Free_MemberFaceSets (SUMA_MEMBER_FACE_SETS *MF) |
| SUMA_VOLPAR * | SUMA_VolPar_Attr (char *volparent_name) |
| SUMA_VOLPAR * | SUMA_VolParFromDset (THD_3dim_dataset *dset) |
| SUMA_Boolean | SUMA_Free_VolPar (SUMA_VOLPAR *VP) |
| SUMA_VOLPAR * | SUMA_Alloc_VolPar (void) |
| int | SUMA_THD_handedness (THD_3dim_dataset *dset) |
| SUMA_Boolean | SUMA_AfniExists (char *prefix, char *c2view) |
| SUMA_Boolean | SUMA_AfniView (char *nameorig, char *cview) |
| SUMA_Boolean | SUMA_AfniExistsView (int exists, char *view) |
| char * | SUMA_AfniPrefix (char *name, char *view, char *path, int *exists) |
| Return AFNI's prefix, from a file name also checks for its validity. | |
| byte * | SUMA_isSkin (THD_3dim_dataset *dset, double *dvec, double thresh, int *N_skin) |
| A function to find the skin of a volume. | |
| void | SUMA_Show_VolPar (SUMA_VOLPAR *VP, FILE *Out) |
| char * | SUMA_VolPar_Info (SUMA_VOLPAR *VP) |
| Form a string containing the info of the volume parent. | |
| SUMA_Boolean | SUMA_Align_to_VolPar (SUMA_SurfaceObject *SO, void *S_struct) |
| Transform the coordinates of a surface object to AFNI-DICOM convention and transform the coordinates by SO->VolPar ans = SUMA_Align_to_VolPar (SO, SF_Struct);. | |
| SUMA_Boolean | SUMA_Apply_VolReg_Trans (SUMA_SurfaceObject *SO) |
| applies the transform in SO->VolPar to SO->NodeList. This only makes sense if SO->NodeList is in DICOM to begin with... | |
| SUMA_Boolean | SUMA_Read_SureFit_Param (char *f_name, SUMA_SureFit_struct *SF) |
| int | SUMA_ReleaseLink (SUMA_INODE *IN) |
| int | SUMA_AddLink (SUMA_INODE *IN) |
| SUMA_INODE * | SUMA_CreateInode (void *data, char *ID) |
| SUMA_INODE * | SUMA_CreateInodeLink (SUMA_INODE *FromIN, SUMA_INODE *ToIN) |
| SUMA_Boolean | SUMA_isInodeLink (SUMA_INODE *IN, const char *HolderIDcode) |
| SUMA_INODE * | SUMA_BreakInodeLink (SUMA_INODE *IN, const char *HolderIDcode) |
| SUMA_Boolean | SUMA_existSO (char *idcode, SUMA_DO *dov, int N_dov) |
| SUMA_Boolean | SUMA_existDO (char *idcode, SUMA_DO *dov, int N_dov) |
| int | SUMA_whichDO (char *idcode, SUMA_DO *dov, int N_dov) |
| int | SUMA_findSO_inDOv (char *idcode, SUMA_DO *dov, int N_dov) |
| SUMA_SurfaceObject * | SUMA_findSOp_inDOv (char *idcode, SUMA_DO *dov, int N_dov) |
| SUMA_SurfaceObject * | SUMA_find_named_SOp_inDOv (char *coordname, SUMA_DO *dov, int N_dov) |
| SUMA_Boolean | SUMA_ismappable (SUMA_SurfaceObject *SO) |
| SUMA_Boolean | SUMA_isINHmappable (SUMA_SurfaceObject *SO) |
| SUMA_Boolean | SUMA_isLocalDomainParent (SUMA_SurfaceObject *SO) |
| SUMA_Boolean | SUMA_isSO (SUMA_DO DO) |
| SUMA_Boolean SUMA_isSO (SUMA_DO DO) returns YUP if DO is of SO_type ans = SUMA_isSO (DO) ;. | |
| SUMA_Boolean | SUMA_isSO_G (SUMA_DO DO, char *Group) |
| SUMA_Boolean SUMA_isSO_G (SUMA_DO DO, char *Group) returns YUP if DO is a surface object and is a part of the group Group. | |
| SUMA_DOMAIN_KINSHIPS | SUMA_WhatAreYouToMe (SUMA_SurfaceObject *SO1, SUMA_SurfaceObject *SO2) |
| ans = SUMA_WhatAreYouToMe (SUMA_SurfaceObject *SO1, SUMA_SurfaceObject *SO2); returns a code for the kinship between two surfaces: | |
| SUMA_Boolean | SUMA_isRelated (SUMA_SurfaceObject *SO1, SUMA_SurfaceObject *SO2, int level) |
| ans = SUMA_isRelated (SUMA_SurfaceObject *SO1, SUMA_SurfaceObject *SO2, int level); | |
| SUMA_Boolean | SUMA_isdROIrelated (SUMA_DRAWN_ROI *ROI, SUMA_SurfaceObject *SO) |
| Returns YUP if the surface: dROI->Parent_idcode_str is related to SO->idcode_str or SO->LocalDomainParentID. NOPE otherwise. | |
| SUMA_Boolean | SUMA_isROIrelated (SUMA_ROI *ROI, SUMA_SurfaceObject *SO) |
| Returns YUP if if the surface: ROI->Parent_idcode_str is related to SO->idcode_str or SO->LocalDomainParentID. NOPE otherwise. | |
| SUMA_DRAWN_ROI * | SUMA_FetchROI_InCreation (SUMA_SurfaceObject *SO, SUMA_DO *dov, int N_dov) |
| Returns an ROI that is related to SO and is in InCreation (being actively drawn) DrawStatus There should only be one ROI in creation at any one time for a group of related surfaces. | |
| SUMA_Boolean | SUMA_AFNI_forward_warp_xyz (THD_warp *warp, float *XYZv, int N) |
| transforms XYZ coordinates by transfrom in warp. ans = SUMA_AFNI_forward_warp_xyz( warp , XYZv, N); | |
| SUMA_Boolean | SUMA_AFNItlrc_toMNI (float *NodeList, int N_Node, char *Coord) |
| transforms XYZ coordinates from AFNI'S RAI talairach space to MNI space in in RAI or (LPI) http://www.mrc-cbu.cam.ac.uk/Imaging/mnispace.html. see Bob's THD_tta_to_mni in thd_mnicoords.c | |
| int | SUMA_Build_Mask_DrawnROI (SUMA_DRAWN_ROI *D_ROI, int *Mask) |
| Return a mask of the nodes belonging to a drawn ROI of a certain surface N_added = SUMA_Build_Mask_DrawnROI (dROI, Mask);. | |
| int * | SUMA_Build_Mask_AllROI (SUMA_DO *dov, int N_dov, SUMA_SurfaceObject *SO, int *Mask, int *N_added) |
| Return a mask of the nodes belonging to any ROI of a certain surface Mask = SUMA_Build_Mask_AllROI (dov, N_dov, SO, Mask, N_added);. | |
| SUMA_ASSEMBLE_LIST_STRUCT * | SUMA_AssembleAllROIList (SUMA_DO *dov, int N_dov, SUMA_Boolean SortByLabel) |
| Returns a list of the ROIs loaded into dov. | |
| SUMA_ASSEMBLE_LIST_STRUCT * | SUMA_FreeAssembleListStruct (SUMA_ASSEMBLE_LIST_STRUCT *str) |
| frees SUMA_ASSEMBLE_LIST_STRUCT * | |
| SUMA_ASSEMBLE_LIST_STRUCT * | SUMA_CreateAssembleListStruct (void) |
| Creates an SUMA_ASSEMBLE_LIST_STRUCT *structure. | |
| SUMA_Boolean | SUMA_DeleteROI (SUMA_DRAWN_ROI *ROI) |
| deletes an ROI from the list of drawn objects | |
| int | SUMA_isTypicalSOforVolSurf (SUMA_SurfaceObject *SO) |
| return +1 if surface is typically the outer layer surface used in Vol2Surf -1 if surface is typically the inner layer surface used in Vol2Surf 0 if no comment | |
Define Documentation
|
|
Value: { \
Shaded = YUP; \
if (SUMAg_CF->X) { \
if (SUMAg_CF->X->DrawROI) {\
if (SUMAg_CF->X->DrawROI->SwitchROIlst) {\
if (!SUMAg_CF->X->DrawROI->SwitchROIlst->isShaded) {\
Shaded = NOPE; \
} \
} \
} \
} \
}
Definition at line 69 of file SUMA_DOmanip.h. Referenced by SUMA_cb_CloseDrawROIWindow(), SUMA_DeleteROI(), SUMA_DrawROI_NewLabel(), and SUMA_ProcessBrushStroke(). |
|
|
Value: { \
Shaded = YUP; \
if (SO) { \
if (SO->SurfCont) {\
if (SO->SurfCont->SwitchDsetlst) {\
if (!SO->SurfCont->SwitchDsetlst->isShaded) {\
Shaded = NOPE; \
} \
} \
} \
} \
}
Definition at line 87 of file SUMA_DOmanip.h. Referenced by SUMA_ColPlane_NewOrder(). |
Function Documentation
|
||||||||||||||||||||||||
|
Add a displayable object to dov Definition at line 289 of file SUMA_DOmanip.c. References SUMA_DO::CoordType, SUMA_DO::ObjectType, SUMA_DO::OP, SUMA_Boolean, SUMA_DO_CoordType, SUMA_DO_Types, SUMA_ENTRY, SUMA_error_message(), SUMA_MAX_DISPLAYABLE_OBJECTS, and SUMA_RETURN. Referenced by main(), SUMA_LoadSegDO(), SUMA_LoadSpec_eng(), SUMA_OpenDrawnROI(), SUMA_PrepAddmappableSO(), SUMA_process_NIML_data(), SUMA_ProcessBrushStroke(), and SUMA_Surf_Plane_Intersect_ROI().
00290 {
00291 static char FuncName[] = {"SUMA_AddDO"};
00292
00293 SUMA_ENTRY;
00294
00295 /* make sure you did not exceed allocated space */
00296 if (*N_dov >= SUMA_MAX_DISPLAYABLE_OBJECTS) {
00297 SUMA_error_message (FuncName, "Reached limit of DOv storage",0);
00298 SUMA_RETURN(NOPE);
00299 }
00300 dov[*N_dov].OP = op;
00301 dov[*N_dov].ObjectType = DO_Type;
00302 dov[*N_dov].CoordType = DO_CoordType;
00303 *N_dov = *N_dov+1;
00304
00305
00306 SUMA_RETURN(YUP);
00307 }
|
|
|
This function increments the N_link field in IN by 1 and returns the resultant N_link value a zero is returned in case of an error ans = SUMA_AddLink (IN);
Definition at line 164 of file SUMA_DOmanip.c. References SUMA_INODE::N_link, SUMA_ENTRY, and SUMA_RETURN. Referenced by SUMA_CreateInodeLink().
00165 {
00166 static char FuncName[]={"SUMA_AddLink"};
00167
00168 SUMA_ENTRY;
00169
00170 if (!IN) {
00171 fprintf (SUMA_STDERR,"Error %s: Inode is null.\n", FuncName);
00172
00173 SUMA_RETURN(0);
00174 } else {
00175 IN->N_link++;
00176 SUMA_RETURN(IN->N_link);
00177 }
00178 }
|
|
||||||||||||||||
|
transforms XYZ coordinates by transfrom in warp. ans = SUMA_AFNI_forward_warp_xyz( warp , XYZv, N);
Definition at line 1854 of file SUMA_VolData.c. References THD_linear_mapping::bot, THD_linear_mapping::bvec, i, MATVEC_SUB, THD_linear_mapping::mfor, THD_warp::rig_bod, SUMA_Boolean, SUMA_ENTRY, SUMA_RETURN, THD_warp::tal_12, THD_linear_mapping::top, THD_warp::type, THD_talairach_12_warp::warp, THD_affine_warp::warp, WARP_AFFINE_TYPE, WARP_TALAIRACH_12_TYPE, and THD_fvec3::xyz.
01855 {
01856 static char FuncName[]={"SUMA_AFNI_forward_warp_xyz"};
01857 THD_fvec3 new_fv, old_fv;
01858 int i, i3;
01859
01860 SUMA_ENTRY;
01861
01862 if( warp == NULL ) {
01863 fprintf (SUMA_STDERR, "Error %s: NULL warp.\n", FuncName);
01864 SUMA_RETURN (NOPE) ;
01865 }
01866
01867 switch( warp->type ){
01868
01869 default:
01870 fprintf (SUMA_STDERR, "Error %s: bad warp->type\n", FuncName);
01871 SUMA_RETURN (NOPE);
01872 break ;
01873
01874 case WARP_TALAIRACH_12_TYPE:{
01875 THD_linear_mapping map ;
01876 int iw ;
01877
01878 /* forward transform each possible case,
01879 and test if result is in bot..top of defined map */
01880
01881 for (i=0; i < N; ++i) {
01882 i3 = 3*i;
01883 old_fv.xyz[0] = xyzv[i3];
01884 old_fv.xyz[1] = xyzv[i3+1];
01885 old_fv.xyz[2] = xyzv[i3+2];
01886
01887 for( iw=0 ; iw < 12 ; iw++ ){
01888 map = warp->tal_12.warp[iw] ;
01889 new_fv = MATVEC_SUB(map.mfor,old_fv,map.bvec) ;
01890
01891 if( new_fv.xyz[0] >= map.bot.xyz[0] &&
01892 new_fv.xyz[1] >= map.bot.xyz[1] &&
01893 new_fv.xyz[2] >= map.bot.xyz[2] &&
01894 new_fv.xyz[0] <= map.top.xyz[0] &&
01895 new_fv.xyz[1] <= map.top.xyz[1] &&
01896 new_fv.xyz[2] <= map.top.xyz[2] ) break ; /* leave loop */
01897 }
01898 xyzv[i3] = new_fv.xyz[0];
01899 xyzv[i3+1] = new_fv.xyz[1];
01900 xyzv[i3+2] = new_fv.xyz[2];
01901
01902 }
01903 }
01904 break ;
01905
01906 case WARP_AFFINE_TYPE:{
01907 THD_linear_mapping map = warp->rig_bod.warp ;
01908 for (i=0; i < N; ++i) {
01909 i3 = 3*i;
01910 old_fv.xyz[0] = xyzv[i3];
01911 old_fv.xyz[1] = xyzv[i3+1];
01912 old_fv.xyz[2] = xyzv[i3+2];
01913 new_fv = MATVEC_SUB(map.mfor,old_fv,map.bvec) ;
01914 xyzv[i3] = new_fv.xyz[0];
01915 xyzv[i3+1] = new_fv.xyz[1];
01916 xyzv[i3+2] = new_fv.xyz[2];
01917 }
01918 }
01919 break ;
01920
01921 }
01922 SUMA_RETURN(YUP);
01923 }
|
|
||||||||||||
|
Definition at line 111 of file SUMA_VolData.c. References LocalHead, SUMA_append_replace_string(), SUMA_Boolean, SUMA_filexists(), SUMA_free, and SUMA_RETURN.
00112 {
00113 static char FuncName[]={"SUMA_AfniExists"};
00114 char *head=NULL;
00115 SUMA_Boolean ans = NOPE;
00116 SUMA_Boolean LocalHead = NOPE;
00117
00118 ans = NOPE;
00119
00120 head = SUMA_append_replace_string(prefix,".HEAD", c2view,0);
00121 if (LocalHead) fprintf(SUMA_STDERR,"%s: Checking existence of %s\n", FuncName, head);
00122 if (SUMA_filexists(head)) { ans = YUP; }
00123 SUMA_free(head); head = NULL;
00124
00125 SUMA_RETURN(ans);
00126 }
|
|
||||||||||||
|
see help for SUMA_AfniPrefix below Definition at line 59 of file SUMA_VolData.c. References SUMA_Boolean, and SUMA_RETURN. Referenced by main(), SUMA_3dSurfMask_ParseInput(), and SUMA_AfniPrefix().
00060 {
00061 static char FuncName[]={"SUMA_AfniExistsView"};
00062 SUMA_Boolean ans = NOPE;
00063
00064 if (!exists) SUMA_RETURN(ans);
00065
00066 if (strcmp(view,"+orig") == 0) {
00067 if (exists == 1 || exists == 3 || exists == 5 || exists == 7) ans = YUP;
00068 } else if (strcmp(view,"+acpc") == 0) {
00069 if (exists == 2 || exists == 3 || exists == 6 || exists == 7) ans = YUP;
00070 } else if (strcmp(view,"+tlrc") == 0) {
00071 if (exists == 4 || exists == 5 || exists == 6 || exists == 7) ans = YUP;
00072 }
00073
00074 SUMA_RETURN(ans);
00075
00076 }
|
|
||||||||||||||||||||
|
Return AFNI's prefix, from a file name also checks for its validity.
Definition at line 147 of file SUMA_VolData.c. References LocalHead, name, SUMA_AfniExistsView(), SUMA_append_replace_string(), SUMA_append_string(), SUMA_Boolean, SUMA_copy_string(), SUMA_ENTRY, SUMA_Extension(), SUMA_filexists(), SUMA_free, SUMA_isExtension(), SUMA_RETURN, SUMA_SL_Err, and THD_filename_ok(). Referenced by main(), SUMA_3dSurfMask_ParseInput(), SUMA_BrainVoyager_Read_vmr(), and SUMA_OpenDX_Read_CruiseVolHead().
00148 {
00149 static char FuncName[]={"SUMA_AfniPrefix"};
00150 char *tmp1 = NULL, *tmp2 = NULL, *prfx = NULL, *name=NULL;
00151 char cview[10];
00152 int iview;
00153 SUMA_Boolean LocalHead = NOPE;
00154
00155 SUMA_ENTRY;
00156
00157 if (!nameorig) SUMA_RETURN(prfx);
00158 if (exists) *exists = 0;
00159
00160 if (LocalHead) fprintf(SUMA_STDERR,"%s: Working with %s\n", FuncName, nameorig);
00161
00162 if (!path) name = SUMA_copy_string(nameorig);
00163 else {
00164 if (path[strlen(path)-1] == '/') {
00165 name = SUMA_append_replace_string(path, nameorig, "", 0);
00166 } else {
00167 name = SUMA_append_replace_string(path, nameorig, "/", 0);
00168 }
00169 }
00170
00171 if (LocalHead) fprintf(SUMA_STDERR,"%s: name now %s\n", FuncName, name);
00172
00173 tmp1 = SUMA_Extension(name, ".HEAD", YUP);
00174 tmp2 = SUMA_Extension(tmp1, ".BRIK", YUP); SUMA_free(tmp1); tmp1 = NULL;
00175 /* is there a dot ?*/
00176 if (tmp2[strlen(tmp2)-1] == '.') tmp2[strlen(tmp2)-1] = '\0';
00177
00178 if (LocalHead) fprintf(SUMA_STDERR,"%s: Searching for view of %s\n", FuncName, tmp2);
00179
00180 /* view */
00181 iview = -1;
00182 if (SUMA_isExtension(tmp2, "+orig")) {
00183 iview = 0; sprintf(cview, "+orig");
00184 prfx = SUMA_Extension(tmp2, "+orig", YUP);
00185 } else if (SUMA_isExtension(tmp2, "+acpc")) {
00186 iview = 1; sprintf(cview, "+acpc");
00187 prfx = SUMA_Extension(tmp2, "+acpc", YUP);
00188 } else if (SUMA_isExtension(tmp2, "+tlrc")) {
00189 iview = 2; sprintf(cview, "+tlrc");
00190 prfx = SUMA_Extension(tmp2, "+tlrc", YUP);
00191 } else {
00192 prfx = SUMA_copy_string(tmp2);
00193 cview[0]='\0';
00194 }
00195 SUMA_free(tmp2); tmp2 = NULL;
00196
00197 if (LocalHead) fprintf(SUMA_STDERR,"%s: Prefix %s\n", FuncName, prfx);
00198
00199 /* can't tell what view is, so can't test properly quite yet */
00200 {
00201 /* is name ok ? all I have to do is test with +orig */
00202 char *bname=SUMA_append_string(prfx,"+orig");
00203 if (LocalHead) fprintf(SUMA_STDERR,"%s: Checking name validity using +orig for view %s\n", FuncName, bname);
00204 if( !THD_filename_ok(bname) ){
00205 SUMA_SL_Err("not a proper dset name!\n") ;
00206 SUMA_free(name); name = NULL;
00207 SUMA_free(prfx); prfx = NULL;
00208 SUMA_free(bname); bname = NULL;
00209 SUMA_RETURN(prfx);
00210 }
00211 }
00212
00213 if (exists) {
00214 { /* look for any */
00215 char *head=NULL, c2view[10];
00216 iview = 0; *exists = 0;
00217 while (iview < 3) {
00218 if (iview == 0) sprintf(c2view, "+orig");
00219 else if (iview == 1) sprintf(c2view, "+acpc");
00220 else if (iview == 2) sprintf(c2view, "+tlrc");
00221 head = SUMA_append_replace_string(prfx,".HEAD", c2view,0);
00222 if (LocalHead) fprintf(SUMA_STDERR,"%s: Checking existence of %s\n", FuncName, head);
00223 if (SUMA_filexists(head)) { *exists += (int)pow(2,iview); }
00224 SUMA_free(head); head = NULL;
00225 ++iview;
00226 }
00227 }
00228 if (LocalHead) fprintf(SUMA_STDERR,"%s: exist number is %d\n", FuncName, *exists);
00229 }
00230
00231
00232 if (cview[0] != '\0') {
00233 if (LocalHead) {
00234 if (SUMA_AfniExistsView(*exists, cview)) {
00235 fprintf(SUMA_STDERR,"%s: dset with view %s does exist.\n", FuncName, cview);
00236 } else {
00237 fprintf(SUMA_STDERR,"%s: dset with view %s does not exist.\n", FuncName, cview);
00238 }
00239 }
00240 }
00241
00242 if (view) {
00243 sprintf(view,"%s", cview);
00244 }
00245 if (name) SUMA_free(name); name = NULL;
00246
00247 SUMA_RETURN(prfx);
00248 }
|
|
||||||||||||||||
|
transforms XYZ coordinates from AFNI'S RAI talairach space to MNI space in in RAI or (LPI) http://www.mrc-cbu.cam.ac.uk/Imaging/mnispace.html. see Bob's THD_tta_to_mni in thd_mnicoords.c
Definition at line 1802 of file SUMA_VolData.c. References i, LocalHead, SUMA_Boolean, SUMA_LH, SUMA_RETURN, and SUMA_S_Err.
01803 {
01804 static char FuncName[]={"SUMA_AFNItlrc_toMNI"};
01805 SUMA_Boolean DoFlip = NOPE;
01806 int i, i3;
01807 float mx = 0.0,my = 0.0,mz = 0.0, tx = 0.0,ty = 0.0,tz = 0.0 ;
01808 SUMA_Boolean LocalHead = NOPE;
01809
01810 if (strcmp(Coord,"RAI") == 0) DoFlip = NOPE;
01811 else if (strcmp(Coord,"LPI") == 0) DoFlip = YUP;
01812 else {
01813 SUMA_S_Err("Can't do. Either RAI or LPI");
01814 SUMA_RETURN(NOPE);
01815 }
01816
01817
01818 for (i=0; i< N_Node; ++i) {
01819 i3 = 3*i;
01820 if (DoFlip) {
01821 if (!i) SUMA_LH("Flipping to LPI");
01822 tx = - NodeList[i3]; ty = -NodeList[i3+1] ; /* flip xy from RAI to LPI */
01823 tz = NodeList[i3+2] ;
01824 } else {
01825 if (!i) SUMA_LH("No Flipping, RAI maintained");
01826 tx = NodeList[i3]; ty = NodeList[i3+1] ; /* flip xy from RAI to LPI */
01827 tz = NodeList[i3+2] ;
01828 }
01829 mx = 1.01010 * tx ;
01830 my = 1.02962 * ty - 0.05154 * tz ;
01831 mz = 0.05434 * ty + 1.08554 * tz ;
01832 if( mz < 0.0 ) mz *= 1.09523 ;
01833 NodeList[i3] = mx;
01834 NodeList[i3+1] = my;
01835 NodeList[i3+2] = mz;
01836 }
01837
01838
01839 SUMA_RETURN(YUP);
01840 }
|
|
||||||||||||
|
Definition at line 78 of file SUMA_VolData.c. References LocalHead, SUMA_Boolean, SUMA_ENTRY, SUMA_Extension(), SUMA_free, SUMA_isExtension(), and SUMA_RETURN. Referenced by main().
00079 {
00080 static char FuncName[]={"SUMA_AfniView"};
00081 char *tmp1 = NULL, *tmp2 = NULL;
00082 SUMA_Boolean LocalHead = NOPE;
00083
00084 SUMA_ENTRY;
00085
00086 if (!nameorig) SUMA_RETURN(NOPE);
00087 if (!cview) SUMA_RETURN(NOPE);
00088
00089 tmp1 = SUMA_Extension(nameorig, ".HEAD", YUP);
00090 tmp2 = SUMA_Extension(tmp1, ".BRIK", YUP); SUMA_free(tmp1); tmp1 = NULL;
00091 /* is there a dot ?*/
00092 if (tmp2[strlen(tmp2)-1] == '.') tmp2[strlen(tmp2)-1] = '\0';
00093
00094 if (LocalHead) fprintf(SUMA_STDERR,"%s: Searching for view of %s\n", FuncName, tmp2);
00095
00096 /* view */
00097 if (SUMA_isExtension(tmp2, "+orig")) {
00098 sprintf(cview, "+orig");
00099 } else if (SUMA_isExtension(tmp2, "+acpc")) {
00100 sprintf(cview, "+acpc");
00101 } else if (SUMA_isExtension(tmp2, "+tlrc")) {
00102 sprintf(cview, "+tlrc");
00103 } else {
00104 cview[0]='\0';
00105 }
00106 SUMA_free(tmp2); tmp2 = NULL;
00107
00108 SUMA_RETURN(YUP);
00109 }
|
|
||||||||||||
|
Transform the coordinates of a surface object to AFNI-DICOM convention and transform the coordinates by SO->VolPar ans = SUMA_Align_to_VolPar (SO, SF_Struct);.
Definition at line 794 of file SUMA_VolData.c. References SUMA_SureFit_struct::AC, SUMA_SureFit_struct::AC_WholeVolume, SUMA_SurfaceObject::FileType, i, SUMA_SurfaceObject::N_Node, SUMA_SurfaceObject::NodeDim, SUMA_SurfaceObject::NodeList, SUMA_Apply_VolReg_Trans(), SUMA_Boolean, SUMA_BRAIN_VOYAGER, SUMA_ENTRY, SUMA_FREE_SURFER, SUMA_FREE_SURFER_PATCH, SUMA_INVENTOR_GENERIC, SUMA_malloc, SUMA_OPENDX_MESH, SUMA_PLY, SUMA_RETURN, SUMA_SUREFIT, SUMA_THD_3dfind_to_3dmm(), SUMA_THD_3dmm_to_dicomm(), SUMA_VEC, THD_coorder_fill(), THD_coorder_to_dicom(), SUMA_SurfaceObject::VolPar, SUMA_VOLPAR::xxorient, THD_fvec3::xyz, SUMA_VOLPAR::yyorient, and SUMA_VOLPAR::zzorient. Referenced by SUMA_Load_Surface_Object_eng().
00795 {
00796 static char FuncName[]={"SUMA_Align_to_VolPar"};
00797 char orcode[3];
00798 float xx, yy, zz;
00799 THD_coorder * cord_surf, *cord_RAI;
00800 int i, ND, id;
00801 SUMA_SureFit_struct *SF;
00802 SUMA_FreeSurfer_struct *FS;
00803
00804 SUMA_ENTRY;
00805
00806 /* allocate for cord structure */
00807 cord_surf = (THD_coorder *)SUMA_malloc(sizeof(THD_coorder));
00808 cord_RAI = (THD_coorder *)SUMA_malloc(sizeof(THD_coorder));
00809 if (cord_surf == NULL || cord_RAI == NULL) {
00810 fprintf(SUMA_STDERR,"Error %s: failed to allocate for cord\n", FuncName);
00811 SUMA_RETURN (NOPE);
00812 }
00813
00814 /* do the dance to get cord for RAI */
00815 THD_coorder_fill( NULL, cord_RAI);
00816 ND = SO->NodeDim;
00817 switch (SO->FileType) {
00818 case SUMA_INVENTOR_GENERIC:
00819 case SUMA_OPENDX_MESH:
00820 case SUMA_PLY:
00821 case SUMA_VEC:
00822 /* Do nothing */
00823 break;
00824 case SUMA_FREE_SURFER:
00825 case SUMA_FREE_SURFER_PATCH:
00826 /* For free surfer, all you need to do is
00827 go from LPI to RAI (DICOM)*/
00828 sprintf(orcode,"LPI");
00829 THD_coorder_fill(orcode , cord_surf);
00830 /*loop over XYZs and change them to dicom*/
00831 for (i=0; i < SO->N_Node; ++i) {
00832 id = i * ND;
00833 THD_coorder_to_dicom (cord_surf, &(SO->NodeList[id]), &(SO->NodeList[id+1]), &(SO->NodeList[id+2]));
00834 }
00835 break;
00836 case SUMA_SUREFIT:
00837 /* For SureFit, coordinates are actually a float version of the indices */
00838 SF = (SUMA_SureFit_struct *)S_Struct;
00839 { THD_fvec3 fv, iv;
00840 float D[3];
00841 /* Calcluate Delta caused by cropping */
00842 for (i=0; i < 3; ++i) D[i] = SF->AC_WholeVolume[i] - SF->AC[i];
00843 /* fprintf (SUMA_STDERR,"%s: Shift Values: [%f, %f, %f]\n", FuncName, D[0], D[1], D[2]); */
00844 for (i=0; i < SO->N_Node; ++i) {
00845 id = i * ND;
00846 /* change float indices to mm coords */
00847 iv.xyz[0] = SO->NodeList[id] + D[0];
00848 iv.xyz[1] = SO->NodeList[id+1] + D[1];
00849 iv.xyz[2] = SO->NodeList[id+2] + D[2];
00850 fv = SUMA_THD_3dfind_to_3dmm( SO, iv );
00851
00852 /* change mm to RAI coords */
00853 iv = SUMA_THD_3dmm_to_dicomm( SO->VolPar->xxorient, SO->VolPar->yyorient, SO->VolPar->zzorient, fv );
00854 SO->NodeList[id] = iv.xyz[0];
00855 SO->NodeList[id+1] = iv.xyz[1];
00856 SO->NodeList[id+2] = iv.xyz[2];
00857 }
00858 }
00859 break;
00860 case SUMA_BRAIN_VOYAGER:
00861 /* For Brain Voyager, all you need to do is
00862 go from AIR to RAI (DICOM)
00863 Note: The center of the volume is at the 1st voxel's center and that huge
00864 center shift, relative to standard AFNI dsets (centered about middle of volume)
00865 might throw off 3dVolreg. If you want to shift volume's center to be in
00866 the middle voxel, you'll need to shift the surface coordinates before transforming
00867 them to ASR*/
00868 sprintf(orcode,"ASR");
00869 THD_coorder_fill(orcode , cord_surf);
00870 /*loop over XYZs and change them to dicom*/
00871 for (i=0; i < SO->N_Node; ++i) {
00872 id = i * ND;
00873 THD_coorder_to_dicom (cord_surf, &(SO->NodeList[id]), &(SO->NodeList[id+1]), &(SO->NodeList[id+2]));
00874 }
00875 break;
00876 default:
00877 fprintf(SUMA_STDERR,"Warning %s: Unknown SO->FileType. Assuming coordinates are in DICOM already.\n", FuncName);
00878 break;
00879 }
00880
00881 if (!SUMA_Apply_VolReg_Trans (SO)) {
00882 fprintf(SUMA_STDERR,"Error %s: Failed in SUMA_Apply_VolReg_Trans.\n", FuncName);
00883 SUMA_RETURN (NOPE);
00884 }
00885
00886 SUMA_RETURN (YUP);
00887 }
|
|
|
Create a Displayable Object data structure Definition at line 213 of file SUMA_DOmanip.c. References SUMA_alloc_problem(), SUMA_ENTRY, SUMA_malloc, and SUMA_RETURN. Referenced by fill_SUMA_structs(), main(), read_surf_files(), and spec2SUMA().
00214 {
00215 static char FuncName[]={"SUMA_Alloc_DisplayObject_Struct"};
00216 SUMA_DO *dov;
00217
00218 SUMA_ENTRY;
00219
00220 dov = (SUMA_DO *)SUMA_malloc(sizeof(SUMA_DO)*N);
00221 if (dov == NULL) {
00222 SUMA_alloc_problem("SUMA_Alloc_DisplayObject_Struct: could not allocate memory for SO");
00223 }
00224 SUMA_RETURN(dov);
00225 }/*SUMA_Alloc_DisplayObject_Struct*/
|
|
|
Returns the attributes of the surface's volume parent A volume parent is defined as: The volume data set used to generate the surface. aka the master SPGR \ret NULL for troubles Definition at line 342 of file SUMA_VolData.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_VOLPAR::isanat, 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_ENTRY, SUMA_malloc, SUMA_RETURN, 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_VolPar_nel2SOVolPar(), and SUMA_VolParFromDset().
00343 {
00344 static char FuncName[]={"SUMA_Alloc_VolPar"};
00345 SUMA_VOLPAR *VP;
00346
00347 SUMA_ENTRY;
00348
00349 VP = (SUMA_VOLPAR *)SUMA_malloc(sizeof(SUMA_VOLPAR));
00350 if (VP == NULL) {
00351 fprintf(SUMA_STDERR,"Error SUMA_Alloc_VolPar: Failed to allocate for VolPar\n");
00352 SUMA_RETURN (NULL);
00353 }
00354 VP->idcode_str = NULL;
00355 VP->isanat = 1;
00356 VP->nx = VP->ny = VP->nz = 0; /*!< number of voxels in the three dimensions */
00357 VP->dx = VP->dy = VP->dz = 0.0; /*!< delta x, y, z in mm */
00358 VP->xorg = VP->yorg = VP->zorg = 0.0; /*!< voxel origin in three dimensions */
00359 VP->prefix = NULL; /*!< parent volume prefix */
00360 VP->filecode = NULL; /*!< parent volume prefix + view */
00361 VP->dirname = NULL; /*!< parent volume directory name */
00362 VP->vol_idcode_str = NULL; /*!< idcode string OF parent volume*/
00363 VP->vol_idcode_date = NULL; /*!< idcode date */
00364 VP->xxorient = VP->yyorient = VP->zzorient = 0; /*!< orientation of three dimensions*/
00365 VP->VOLREG_CENTER_OLD = NULL; /*!< pointer to the named attribute (3x1) in the .HEAD file of the experiment-aligned Parent Volume */
00366 VP->VOLREG_CENTER_BASE = NULL; /*!< pointer to the named attribute (3x1) in the .HEAD file of the experiment-aligned Parent Volume */
00367 VP->VOLREG_MATVEC = NULL; /*!< pointer to the named attribute (12x1) in the .HEAD file of the experiment-aligned Parent Volume */
00368 VP->TAGALIGN_MATVEC = NULL; /*!< pointer to the named attribute (12x1) in the .HEAD file of the tag aligned Parent Volume */
00369 VP->ROTATE_MATVEC = NULL; /*!< pointer to the named attribute (12x1) in the .HEAD file of the 3drotated Parent Volume */
00370 VP->ROTATE_CENTER_OLD = NULL;
00371 VP->ROTATE_CENTER_BASE = NULL;
00372 VP->Hand = 1; /*!< Handedness of axis 1 RH, -1 LH*/
00373
00374 SUMA_RETURN(VP);
00375 }
|
|
|
applies the transform in SO->VolPar to SO->NodeList. This only makes sense if SO->NodeList is in DICOM to begin with...
Definition at line 897 of file SUMA_VolData.c. References i, SUMA_CommonFields::IgnoreVolreg, SUMA_SurfaceObject::N_Node, SUMA_SurfaceObject::NodeDim, SUMA_SurfaceObject::NodeList, SUMA_SurfaceObject::ROTATE_APPLIED, SUMA_VOLPAR::ROTATE_CENTER_BASE, SUMA_VOLPAR::ROTATE_CENTER_OLD, SUMA_VOLPAR::ROTATE_MATVEC, SUMA_Boolean, SUMA_ENTRY, SUMA_RETURN, SUMA_SL_Note, SUMA_SurfaceObject::TAGALIGN_APPLIED, SUMA_VOLPAR::TAGALIGN_MATVEC, SUMA_SurfaceObject::VolPar, SUMA_SurfaceObject::VOLREG_APPLIED, SUMA_VOLPAR::VOLREG_CENTER_BASE, SUMA_VOLPAR::VOLREG_CENTER_OLD, and SUMA_VOLPAR::VOLREG_MATVEC. Referenced by SUMA_Align_to_VolPar().
00898 {
00899 static char FuncName[]={"SUMA_Apply_VolReg_Trans"};
00900 int i, ND, id;
00901 SUMA_Boolean UseVolreg, UseTagAlign, UseRotate, Bad=YUP;
00902
00903 SUMA_ENTRY;
00904
00905 if (SUMAg_CF->IgnoreVolreg) {
00906 SUMA_SL_Note("Ignoring any Volreg or TagAlign transforms present in Surface Volume.\n");
00907 SO->VOLREG_APPLIED = NOPE;
00908 SUMA_RETURN (YUP);
00909 }
00910
00911 if (SO->VOLREG_APPLIED || SO->TAGALIGN_APPLIED || SO->ROTATE_APPLIED) {
00912 fprintf (SUMA_STDERR,"Error %s: Volreg (or Tagalign or rotate) already applied. Nothing done.\n", FuncName);
00913 SUMA_RETURN (NOPE);
00914 }
00915
00916 ND = SO->NodeDim;
00917
00918
00919 UseVolreg = NOPE;
00920 UseTagAlign = NOPE;
00921 UseRotate = NOPE;
00922 /* perform the rotation needed to align the surface with the current experiment's data */
00923 if (SO->VolPar->VOLREG_MATVEC != NULL || SO->VolPar->VOLREG_CENTER_OLD != NULL || SO->VolPar->VOLREG_CENTER_BASE != NULL) {
00924 Bad = NOPE;
00925 if (SO->VolPar->VOLREG_MATVEC == NULL) {
00926 fprintf(SUMA_STDERR,"Error %s: SO->VolPar->VOLREG_MATVEC = NULL. Cannot perform alignment.\n", FuncName);
00927 Bad = YUP;
00928 }
00929 if (SO->VolPar->VOLREG_CENTER_OLD == NULL) {
00930 fprintf(SUMA_STDERR,"Error %s: SO->VolPar->VOLREG_CENTER_OLD = NULL. Cannot perform alignment.\n", FuncName);
00931 Bad = YUP;
00932 }
00933 if (SO->VolPar->VOLREG_CENTER_BASE == NULL) {
00934 fprintf(SUMA_STDERR,"Error %s: SO->VolPar->VOLREG_CENTER_BASE = NULL. Cannot perform alignment.\n", FuncName);
00935 Bad = YUP;
00936 }
00937 if (!Bad) UseVolreg = YUP;
00938 }
00939
00940 /* Check for Tagalign and Rotate field */
00941 if (SO->VolPar->TAGALIGN_MATVEC) UseTagAlign = YUP;
00942 if (SO->VolPar->ROTATE_MATVEC || SO->VolPar->ROTATE_CENTER_OLD || SO->VolPar->ROTATE_CENTER_BASE) {
00943 Bad = NOPE;
00944 if (SO->VolPar->ROTATE_MATVEC == NULL) {
00945 fprintf(SUMA_STDERR,"Error %s: SO->VolPar->ROTATE_MATVEC = NULL. Cannot perform alignment.\n", FuncName);
00946 Bad = YUP;
00947 }
00948 if (SO->VolPar->ROTATE_CENTER_OLD == NULL) {
00949 fprintf(SUMA_STDERR,"Error %s: SO->VolPar->ROTATE_CENTER_OLD = NULL. Cannot perform alignment.\n", FuncName);
00950 Bad = YUP;
00951 }
00952 if (SO->VolPar->ROTATE_CENTER_BASE == NULL) {
00953 fprintf(SUMA_STDERR,"Error %s: SO->VolPar->ROTATE_CENTER_BASE = NULL. Cannot perform alignment.\n", FuncName);
00954 Bad = YUP;
00955 }
00956 if (!Bad) UseRotate = YUP;
00957 }
00958
00959 if (UseTagAlign && UseVolreg) {
00960 SUMA_SL_Note("Found both Volreg and TagAlign fields.\n"
00961 "Using Volreg fields for alignment.");
00962 UseTagAlign = NOPE;
00963 }
00964 if (UseRotate && UseVolreg) {
00965 SUMA_SL_Note("Found both Volreg and Rotate fields.\n"
00966 "Using Volreg fields for alignment.");
00967 UseRotate = NOPE;
00968 }
00969 if (UseRotate && UseTagAlign) {
00970 SUMA_SL_Note("Found both Rotate and TagAlign fields.\n"
00971 "Using Tagalign fields for alignment.");
00972 UseRotate = NOPE;
00973 }
00974
00975 if (UseTagAlign) {
00976 float Mrot[3][3], Delta[3], x, y, z, NetShift[3];
00977
00978 /* fillerup*/
00979 Mrot[0][0] = SO->VolPar->TAGALIGN_MATVEC[0];
00980 Mrot[0][1] = SO->VolPar->TAGALIGN_MATVEC[1];
00981 Mrot[0][2] = SO->VolPar->TAGALIGN_MATVEC[2];
00982 Delta[0] = SO->VolPar->TAGALIGN_MATVEC[3];
00983 Mrot[1][0] = SO->VolPar->TAGALIGN_MATVEC[4];
00984 Mrot[1][1] = SO->VolPar->TAGALIGN_MATVEC[5];
00985 Mrot[1][2] = SO->VolPar->TAGALIGN_MATVEC[6];
00986 Delta[1] = SO->VolPar->TAGALIGN_MATVEC[7];
00987 Mrot[2][0] = SO->VolPar->TAGALIGN_MATVEC[8];
00988 Mrot[2][1] = SO->VolPar->TAGALIGN_MATVEC[9];
00989 Mrot[2][2] = SO->VolPar->TAGALIGN_MATVEC[10];
00990 Delta[2] = SO->VolPar->TAGALIGN_MATVEC[11];
00991
00992 NetShift[0] = Delta[0];
00993 NetShift[1] = Delta[1];
00994 NetShift[2] = Delta[2];
00995
00996 /*
00997 fprintf (SUMA_STDERR,"%s: Applying Rotation.\nMrot[\t%f\t%f\t%f\n%f\t%f\t%f\n%f\t%f\t%f]\nDelta = [%f %f %f]\n", FuncName,\
00998 Mrot[0][0], Mrot[0][1], Mrot[0][2], Mrot[1][0], Mrot[1][1], Mrot[1][2], Mrot[2][0], Mrot[2][1], Mrot[2][2], \
00999 Delta[0], Delta[1], Delta[2]);
01000
01001 */
01002
01003 for (i=0; i < SO->N_Node; ++i) {
01004 id = ND * i;
01005 /* zero the center */
01006 x = SO->NodeList[id] ;
01007 y = SO->NodeList[id+1] ;
01008 z = SO->NodeList[id+2] ;
01009
01010 /* Apply the rotation matrix XYZn = Mrot x XYZ*/
01011 SO->NodeList[id] = Mrot[0][0] * x + Mrot[0][1] * y + Mrot[0][2] * z;
01012 SO->NodeList[id+1] = Mrot[1][0] * x + Mrot[1][1] * y + Mrot[1][2] * z;
01013 SO->NodeList[id+2] = Mrot[2][0] * x + Mrot[2][1] * y + Mrot[2][2] * z;
01014
01015 /*apply netshift*/
01016 SO->NodeList[id] += NetShift[0];
01017 SO->NodeList[id+1] += NetShift[1];
01018 SO->NodeList[id+2] += NetShift[2];
01019 }
01020 SO->TAGALIGN_APPLIED = YUP;
01021 } else
01022 SO->TAGALIGN_APPLIED = NOPE;
01023
01024 if (UseVolreg) {
01025 float Mrot[3][3], Delta[3], x, y, z, NetShift[3];
01026
01027 /* fillerup*/
01028 Mrot[0][0] = SO->VolPar->VOLREG_MATVEC[0];
01029 Mrot[0][1] = SO->VolPar->VOLREG_MATVEC[1];
01030 Mrot[0][2] = SO->VolPar->VOLREG_MATVEC[2];
01031 Delta[0] = SO->VolPar->VOLREG_MATVEC[3];
01032 Mrot[1][0] = SO->VolPar->VOLREG_MATVEC[4];
01033 Mrot[1][1] = SO->VolPar->VOLREG_MATVEC[5];
01034 Mrot[1][2] = SO->VolPar->VOLREG_MATVEC[6];
01035 Delta[1] = SO->VolPar->VOLREG_MATVEC[7];
01036 Mrot[2][0] = SO->VolPar->VOLREG_MATVEC[8];
01037 Mrot[2][1] = SO->VolPar->VOLREG_MATVEC[9];
01038 Mrot[2][2] = SO->VolPar->VOLREG_MATVEC[10];
01039 Delta[2] = SO->VolPar->VOLREG_MATVEC[11];
01040
01041 NetShift[0] = SO->VolPar->VOLREG_CENTER_BASE[0] + Delta[0];
01042 NetShift[1] = SO->VolPar->VOLREG_CENTER_BASE[1] + Delta[1];
01043 NetShift[2] = SO->VolPar->VOLREG_CENTER_BASE[2] + Delta[2];
01044
01045 /*
01046 fprintf (SUMA_STDERR,"%s: Applying Rotation.\nMrot[\t%f\t%f\t%f\n%f\t%f\t%f\n%f\t%f\t%f]\nDelta = [%f %f %f]\n", FuncName,\
01047 Mrot[0][0], Mrot[0][1], Mrot[0][2], Mrot[1][0], Mrot[1][1], Mrot[1][2], Mrot[2][0], Mrot[2][1], Mrot[2][2], \
01048 Delta[0], Delta[1], Delta[2]);
01049 fprintf (SUMA_STDERR,"VOLREG_CENTER_BASE = [%f %f %f]. VOLREG_CENTER_OLD = [%f %f %f]\n", \
01050 SO->VolPar->VOLREG_CENTER_BASE[0], SO->VolPar->VOLREG_CENTER_BASE[1], SO->VolPar->VOLREG_CENTER_BASE[2], \
01051 SO->VolPar->VOLREG_CENTER_OLD[0], SO->VolPar->VOLREG_CENTER_OLD[1], SO->VolPar->VOLREG_CENTER_OLD[2]);
01052 */
01053
01054 for (i=0; i < SO->N_Node; ++i) {
01055 id = ND * i;
01056 /* zero the center */
01057 x = SO->NodeList[id ] - SO->VolPar->VOLREG_CENTER_OLD[0];
01058 y = SO->NodeList[id+1] - SO->VolPar->VOLREG_CENTER_OLD[1];
01059 z = SO->NodeList[id+2] - SO->VolPar->VOLREG_CENTER_OLD[2];
01060
01061 /* Apply the rotation matrix XYZn = Mrot x XYZ*/
01062 SO->NodeList[id ] = Mrot[0][0] * x + Mrot[0][1] * y + Mrot[0][2] * z;
01063 SO->NodeList[id+1] = Mrot[1][0] * x + Mrot[1][1] * y + Mrot[1][2] * z;
01064 SO->NodeList[id+2] = Mrot[2][0] * x + Mrot[2][1] * y + Mrot[2][2] * z;
01065
01066 /*apply netshift*/
01067 SO->NodeList[id ] += NetShift[0];
01068 SO->NodeList[id+1] += NetShift[1];
01069 SO->NodeList[id+2] += NetShift[2];
01070 }
01071 SO->VOLREG_APPLIED = YUP;
01072 } else
01073 SO->VOLREG_APPLIED = NOPE;
01074
01075 if (UseRotate) {
01076 float Mrot[3][3], Delta[3], x, y, z, NetShift[3];
01077
01078 /* fillerup*/
01079 Mrot[0][0] = SO->VolPar->ROTATE_MATVEC[0];
01080 Mrot[0][1] = SO->VolPar->ROTATE_MATVEC[1];
01081 Mrot[0][2] = SO->VolPar->ROTATE_MATVEC[2];
01082 Delta[0] = SO->VolPar->ROTATE_MATVEC[3];
01083 Mrot[1][0] = SO->VolPar->ROTATE_MATVEC[4];
01084 Mrot[1][1] = SO->VolPar->ROTATE_MATVEC[5];
01085 Mrot[1][2] = SO->VolPar->ROTATE_MATVEC[6];
01086 Delta[1] = SO->VolPar->ROTATE_MATVEC[7];
01087 Mrot[2][0] = SO->VolPar->ROTATE_MATVEC[8];
01088 Mrot[2][1] = SO->VolPar->ROTATE_MATVEC[9];
01089 Mrot[2][2] = SO->VolPar->ROTATE_MATVEC[10];
01090 Delta[2] = SO->VolPar->ROTATE_MATVEC[11];
01091
01092 NetShift[0] = SO->VolPar->ROTATE_CENTER_BASE[0] + Delta[0];
01093 NetShift[1] = SO->VolPar->ROTATE_CENTER_BASE[0] + Delta[1];
01094 NetShift[2] = SO->VolPar->ROTATE_CENTER_BASE[0] + Delta[2];
01095
01096 /*
01097 fprintf (SUMA_STDERR,"%s: Applying Rotation.\nMrot[\t%f\t%f\t%f\n%f\t%f\t%f\n%f\t%f\t%f]\nDelta = [%f %f %f]\n", FuncName,\
01098 Mrot[0][0], Mrot[0][1], Mrot[0][2], Mrot[1][0], Mrot[1][1], Mrot[1][2], Mrot[2][0], Mrot[2][1], Mrot[2][2], \
01099 Delta[0], Delta[1], Delta[2]);
01100 fprintf (SUMA_STDERR,"ROTATE_CENTER_BASE = [%f %f %f]. ROTATE_CENTER_OLD = [%f %f %f]\n", \
01101 SO->VolPar->ROTATE_CENTER_BASE[0], SO->VolPar->ROTATE_CENTER_BASE[1], SO->VolPar->ROTATE_CENTER_BASE[2], \
01102 SO->VolPar->ROTATE_CENTER_OLD[0], SO->VolPar->ROTATE_CENTER_OLD[1], SO->VolPar->ROTATE_CENTER_OLD[2]);
01103 */
01104
01105 for (i=0; i < SO->N_Node; ++i) {
01106 id = ND * i;
01107 /* zero the center */
01108 x = SO->NodeList[id ] - SO->VolPar->ROTATE_CENTER_OLD[0];
01109 y = SO->NodeList[id+1] - SO->VolPar->ROTATE_CENTER_OLD[1];
01110 z = SO->NodeList[id+2] - SO->VolPar->ROTATE_CENTER_OLD[1];
01111
01112 /* Apply the rotation matrix XYZn = Mrot x XYZ*/
01113 SO->NodeList[id ] = Mrot[0][0] * x + Mrot[0][1] * y + Mrot[0][2] * z;
01114 SO->NodeList[id+1] = Mrot[1][0] * x + Mrot[1][1] * y + Mrot[1][2] * z;
01115 SO->NodeList[id+2] = Mrot[2][0] * x + Mrot[2][1] * y + Mrot[2][2] * z;
01116
01117 /*apply netshift*/
01118 SO->NodeList[id ] += NetShift[0];
01119 SO->NodeList[id+1] += NetShift[1];
01120 SO->NodeList[id+2] += NetShift[2];
01121 }
01122 SO->ROTATE_APPLIED = YUP;
01123 } else
01124 SO->ROTATE_APPLIED = NOPE;
01125
01126 SUMA_RETURN (YUP);
01127 }
|
|
||||||||||||||||
|
Returns a list of the ROIs loaded into dov.
Definition at line 1134 of file SUMA_DOmanip.c. References SUMA_ASSEMBLE_LIST_STRUCT::clist, DListElmt_::data, dlist_destroy(), dlist_head, dlist_init(), dlist_ins_next(), dlist_ins_prev(), dlist_next, dlist_tail, i, SUMA_SurfaceObject::Label, SUMA_DRAWN_ROI::Label, LocalHead, SUMA_ASSEMBLE_LIST_STRUCT::N_clist, SUMA_ASSEMBLE_LIST_STRUCT::oplist, SUMA_DRAWN_ROI::Parent_idcode_str, ROIdO_type, DList_::size, SUMA_Boolean, SUMA_calloc, SUMA_CreateAssembleListStruct(), SUMA_ENTRY, SUMA_findSOp_inDOv(), SUMA_free, SUMA_malloc, SUMA_MAX_NAME_LENGTH, and SUMA_RETURN. Referenced by SUMA_cb_DrawROI_SwitchROI(), and SUMA_DeleteROI().
01135 {
01136 static char FuncName[]={"SUMA_AssembleAllROIList"};
01137 int i=-1, N_clist=-1;
01138 DList *list=NULL, *listop = NULL;
01139 DListElmt *Elm = NULL, *Elmop = NULL;
01140 char Label[SUMA_MAX_NAME_LENGTH], Parent_Label[SUMA_MAX_NAME_LENGTH], *store=NULL;
01141 SUMA_SurfaceObject *SO = NULL;
01142 char **clist=NULL;
01143 void **oplist=NULL;
01144 SUMA_DRAWN_ROI *ROI=NULL;
01145 SUMA_ASSEMBLE_LIST_STRUCT *clist_str = NULL;
01146 SUMA_Boolean Found = NOPE;
01147 SUMA_Boolean LocalHead = NOPE;
01148
01149 SUMA_ENTRY;
01150
01151 list = (DList *)SUMA_malloc(sizeof(DList));
01152 listop = (DList *)SUMA_malloc(sizeof(DList));
01153
01154 clist = NULL;
01155 N_clist = -1;
01156
01157 dlist_init(list, NULL);
01158 dlist_init(listop, NULL);
01159 for (i=0; i < N_dov; ++i) {
01160 if (dov[i].ObjectType == ROIdO_type) {
01161 ROI = (SUMA_DRAWN_ROI *)dov[i].OP;
01162 if (LocalHead) fprintf (SUMA_STDERR, "%s: Found an ROI %s\n", FuncName, ROI->Label);
01163 if (!ROI->Label) sprintf (Label,"NULL");
01164 else sprintf (Label,"%s", ROI->Label);
01165 if (!ROI->Parent_idcode_str) sprintf (Parent_Label,"NULL");
01166 else {
01167 SO = SUMA_findSOp_inDOv(ROI->Parent_idcode_str, dov, N_dov);
01168 if (!SO) sprintf (Parent_Label,"Unknown");
01169 else if (!SO->Label) sprintf (Parent_Label,"Empty");
01170 else sprintf (Parent_Label,"%s", SO->Label);
01171 }
01172 /* Now allocate space for that label */
01173 store = (char *)SUMA_calloc(strlen(Label)+strlen(Parent_Label)+5, sizeof(char));
01174 if (SortByLabel) {
01175 sprintf(store,"%s:%s", Label, Parent_Label);
01176 } else {
01177 sprintf(store,"%s:%s", Parent_Label, Label);
01178 }
01179
01180 /* now place it in the list by aplhpabetical order */
01181 if (!list->size) {
01182 dlist_ins_next(list, dlist_tail(list), (void*)store);
01183 dlist_ins_next(listop, dlist_tail(listop), (void*)ROI);
01184 }else { /* must sort first */
01185 Elm = NULL;
01186 Elmop = NULL;
01187 do {
01188 Found = NOPE;
01189 if (!Elm) {
01190 Elm = dlist_head(list);
01191 Elmop = dlist_head(listop);
01192 } else {
01193 Elm = dlist_next(Elm);
01194 Elmop = dlist_next(Elmop);
01195 }
01196
01197 if (strcmp(store, (char*)Elm->data) <= 0) {
01198 dlist_ins_prev(list, Elm, (void *)store);
01199 dlist_ins_prev(listop, Elmop, (void *)ROI);
01200 Found = YUP;
01201 } else if (Elm == dlist_tail(list)) {
01202 /* reached the end, append */
01203 dlist_ins_next(list, Elm, (void *)store);
01204 dlist_ins_next(listop, Elmop, (void *)ROI);
01205 Found = YUP;
01206 }
01207 } while (!Found);
01208 }
01209
01210 }
01211 }
01212
01213 if (!list->size) { /* Nothing found */
01214 N_clist = 0;
01215
01216 }else {
01217
01218 Elm = NULL;
01219 Elmop = NULL;
01220 clist = (char **)SUMA_calloc(list->size, sizeof(char *));
01221 oplist = (void **)SUMA_calloc(list->size, sizeof(void*));
01222 for (i=0; i< list->size; ++i) {
01223 if (!Elm) {
01224 Elm = dlist_head(list);
01225 Elmop = dlist_head(listop);
01226 } else {
01227 Elm = dlist_next(Elm);
01228 Elmop = dlist_next(Elmop);
01229 }
01230 clist[i] = (char*)Elm->data;
01231 oplist[i] = Elmop->data;
01232 }
01233
01234 N_clist = list->size;
01235 /* destroy list */
01236 dlist_destroy(list);
01237 dlist_destroy(listop);
01238 SUMA_free(list);
01239 SUMA_free(listop);
01240 }
01241
01242 clist_str = SUMA_CreateAssembleListStruct();
01243 clist_str->clist = clist;
01244 clist_str->oplist = oplist;
01245 clist_str->N_clist = N_clist;
01246
01247 /* return */
01248 SUMA_RETURN (clist_str);
01249 }
|
|
||||||||||||
|
function to remove the link of one IDnode to the next SUMA_INODE * SUMA_BreakInodeLink (SUMA_INODE *IN, const char *HolderIDcode);
Definition at line 90 of file SUMA_DOmanip.c. References SUMA_ENTRY, SUMA_isInodeLink(), SUMA_ReleaseLink(), and SUMA_RETURN.
00091 {
00092 static char FuncName[] = {"SUMA_BreakInodeLink"};
00093
00094 SUMA_ENTRY;
00095
00096 if (!IN) {
00097 fprintf (SUMA_STDERR, "Warning %s: IN is null, nothing to do.\n", FuncName);
00098 SUMA_RETURN(NULL);
00099 }
00100 if (!SUMA_isInodeLink (IN, HolderIDcode)) {
00101 fprintf (SUMA_STDERR, "Error %s: Inode IN is not a link. Nothing done.\n", FuncName);
00102 SUMA_RETURN(IN);
00103 }
00104
00105 /* release the link */
00106 if (SUMA_ReleaseLink (IN) < 0) {
00107 fprintf (SUMA_STDERR, "Error %s: IN has no links. Nothing done.\n", FuncName);
00108 SUMA_RETURN(IN);
00109 }
00110
00111 /* OK, link released, not return NULL */
00112 SUMA_RETURN(NULL);
00113 }
|
|
||||||||||||||||||||||||
|
Return a mask of the nodes belonging to any ROI of a certain surface Mask = SUMA_Build_Mask_AllROI (dov, N_dov, SO, Mask, N_added);.
Definition at line 1423 of file SUMA_DOmanip.c. References i, LocalHead, SUMA_SurfaceObject::N_Node, ROIdO_type, ROIO_type, SUMA_Boolean, SUMA_Build_Mask_DrawnROI(), SUMA_calloc, SUMA_ENTRY, SUMA_free, SUMA_isdROIrelated(), SUMA_isROIrelated(), SUMA_RETURN, and SUMA_S_Err. Referenced by SUMA_ProcessBrushStroke().
01424 {
01425 static char FuncName[]={"SUMA_Build_Mask_AllROI"};
01426 int Npart = 0,i;
01427 SUMA_DRAWN_ROI *D_ROI=NULL;
01428 SUMA_ROI *ROI = NULL;
01429 SUMA_Boolean LocalHead = NOPE;
01430
01431 SUMA_ENTRY;
01432
01433 *N_added = -1;
01434
01435 if (!Mask) { /* allocate for it */
01436 Mask = (int *)SUMA_calloc(SO->N_Node, sizeof(int));
01437 if (!Mask) {
01438 SUMA_S_Err ("Failed to allocate for Mask.");
01439 SUMA_RETURN(NULL);
01440 }
01441 }
01442
01443 for (i=0; i < N_do; ++i) {
01444 switch (dov[i].ObjectType) { /* case Object Type */
01445 case ROIdO_type:
01446 D_ROI = (SUMA_DRAWN_ROI *)dov[i].OP;
01447 if (SUMA_isdROIrelated (D_ROI, SO)) {
01448 if (LocalHead) fprintf (SUMA_STDERR, "%s: Found a drawn ROI, building mask...\n", FuncName);
01449
01450 Npart = SUMA_Build_Mask_DrawnROI (D_ROI, Mask);
01451 if (Npart < 0) {
01452 SUMA_S_Err ("Badness in SUMA_Build_Mask_DrawnROI");
01453 if (Mask) SUMA_free(Mask);
01454 *N_added = -1;
01455 SUMA_RETURN(NULL);
01456 }else {
01457 *N_added = *N_added + Npart;
01458 if (LocalHead) fprintf (SUMA_STDERR, "%s: %d nodes found in that ROI.\n", FuncName, Npart);
01459 }
01460 }
01461 break;
01462 case ROIO_type:
01463 ROI = (SUMA_ROI *)dov[i].OP;
01464 if (SUMA_isROIrelated (ROI, SO)) {
01465 SUMA_S_Err ("Not dealing with regular ROIs yet");
01466 }
01467 break;
01468 default:
01469 /* not an ROI */
01470 break;
01471 }
01472 }
01473
01474 SUMA_RETURN(Mask);
01475 }
|
|
||||||||||||
|
Return a mask of the nodes belonging to a drawn ROI of a certain surface N_added = SUMA_Build_Mask_DrawnROI (dROI, Mask);.
Definition at line 1490 of file SUMA_DOmanip.c. References DListElmt_::data, dlist_head, dlist_next, dlist_size, dlist_tail, SUMA_ROI_DATUM::N_n, SUMA_ROI_DATUM::nPath, SUMA_DRAWN_ROI::ROIstrokelist, SUMA_ENTRY, SUMA_RETURN, and SUMA_S_Err. Referenced by SUMA_Build_Mask_AllROI(), and SUMA_ProcessBrushStroke().
01491 {
01492 static char FuncName[]={"SUMA_Build_Mask_DrawnROI"};
01493 DListElmt *NextElm=NULL;
01494 int ii, N_added;
01495 SUMA_ROI_DATUM *ROId=NULL;
01496
01497 SUMA_ENTRY;
01498
01499 N_added = -1;
01500
01501 if (!Mask) {
01502 SUMA_S_Err ("Mask is NULL");
01503 SUMA_RETURN(N_added);
01504 }
01505
01506 if (!D_ROI->ROIstrokelist) {
01507 N_added = 0;
01508 SUMA_RETURN(N_added);
01509 }
01510
01511 if (!dlist_size(D_ROI->ROIstrokelist)) {
01512 N_added = 0;
01513 SUMA_RETURN(N_added);
01514 }
01515
01516 /* start with the first element */
01517 NextElm = NULL;
01518 do {
01519 if (!NextElm) {
01520 NextElm = dlist_head(D_ROI->ROIstrokelist);
01521 }else {
01522 NextElm = dlist_next(NextElm);
01523 }
01524 ROId = (SUMA_ROI_DATUM *)NextElm->data;
01525 if (ROId->N_n) {
01526 for (ii = 0; ii < ROId->N_n; ++ii) {
01527 ++Mask[ROId->nPath[ii]];
01528 ++N_added;
01529 }
01530 }
01531 } while (NextElm != dlist_tail(D_ROI->ROIstrokelist));
01532
01533 SUMA_RETURN (N_added);
01534 }
|
|
|
Creates an SUMA_ASSEMBLE_LIST_STRUCT *structure.
Definition at line 1255 of file SUMA_DOmanip.c. References SUMA_ASSEMBLE_LIST_STRUCT::clist, SUMA_ASSEMBLE_LIST_STRUCT::N_clist, SUMA_ASSEMBLE_LIST_STRUCT::oplist, SUMA_ENTRY, SUMA_malloc, and SUMA_RETURN. Referenced by SUMA_AssembleAllROIList(), SUMA_AssembleCmapList(), SUMA_AssembleColorPlaneList(), and SUMA_AssembleGroupList().
01256 {
01257 static char FuncName[]={"SUMA_CreateAssembleListStruct"};
01258 SUMA_ASSEMBLE_LIST_STRUCT *str=NULL;
01259
01260 SUMA_ENTRY;
01261
01262 str = (SUMA_ASSEMBLE_LIST_STRUCT *)SUMA_malloc(sizeof(SUMA_ASSEMBLE_LIST_STRUCT));
01263 str->clist = NULL;
01264 str->N_clist = -1;
01265 str->oplist = NULL;
01266
01267 SUMA_RETURN(str);
01268 }
|
|
||||||||||||
|
Function to create a SUMA_INODE structure ans = SUMA_CreateInode (data, ParentIDcode);
Definition at line 190 of file SUMA_DOmanip.c. References SUMA_INODE::data, SUMA_INODE::N_link, SUMA_INODE::ParentIDcode, SUMA_ENTRY, SUMA_malloc, and SUMA_RETURN.
00191 {
00192 static char FuncName[]={"SUMA_CreateInode"};
00193 SUMA_INODE *IN;
00194
00195 SUMA_ENTRY;
00196
00197 IN = (SUMA_INODE *)SUMA_malloc (sizeof(SUMA_INODE));
00198 if (IN == NULL) {
00199 fprintf (SUMA_STDERR,"Error %s: failed to allocate for Inode.\n", FuncName);
00200 SUMA_RETURN(NULL);
00201 }
00202
00203 IN->data = data;
00204 strcpy (IN->ParentIDcode, ID);
00205 IN->N_link = 0;
00206
00207 SUMA_RETURN(IN);
00208 }
|
|
||||||||||||
|
This function Links one Inode to another. This is different from CreateInode in that no new node is being allocated for, only a link is created. SUMA_CreateInodeLink (SUMA_INODE * FromIN, SUMA_INODE *ToIN) FromIN = SUMA_CreateInodeLink (FromIN, ToIN);
Definition at line 30 of file SUMA_DOmanip.c. References SUMA_AddLink(), SUMA_ENTRY, and SUMA_RETURN.
00031 {
00032 static char FuncName[] = {"SUMA_CreateInodeLink"};
00033
00034 SUMA_ENTRY;
00035
00036 if (FromIN) {
00037 fprintf (SUMA_STDERR,"Error %s: FromIN Inode is not NULL. \n\tFromIN pointer is left undisturbed.\n", FuncName);
00038 SUMA_RETURN(FromIN);
00039 }
00040 if (!ToIN) {
00041 fprintf (SUMA_STDERR,"Error %s: ToIN is NULL.\n\t Can't link to NULL, returning NULL.\n", FuncName);
00042 SUMA_RETURN(NULL);
00043 }
00044
00045 /* add a link to ToIN */
00046 if (!SUMA_AddLink (ToIN)) {
00047 fprintf (SUMA_STDERR,"Error %s: Failed in SUMA_AddLink.\n", FuncName);
00048 SUMA_RETURN(NULL);
00049 }
00050
00051 /* now return the pointer to be linked to */
00052 SUMA_RETURN(ToIN);
00053
00054 }
|
|
|
deletes an ROI from the list of drawn objects
Definition at line 1539 of file SUMA_DOmanip.c. References SUMA_X_DrawROI::curDrawnROI, SUMA_X_AllView::DrawROI, i, LocalHead, SUMA_ASSEMBLE_LIST_STRUCT::N_clist, SUMA_ASSEMBLE_LIST_STRUCT::oplist, SUMA_AssembleAllROIList(), SUMA_Boolean, SUMA_cb_CloseSwitchROI(), SUMA_ENTRY, SUMA_FreeAssembleListStruct(), SUMA_InitializeDrawROIWindow(), SUMA_IS_DRAW_ROI_SWITCH_ROI_SHADED, SUMA_LH, SUMA_RemoveDO(), SUMA_RETURN, SUMA_SLP_Err, SUMAg_N_DOv, SUMA_X_DrawROI::SwitchROIlst, and SUMA_CommonFields::X. Referenced by SUMA_cb_DrawROI_Delete(), and SUMA_OpenDrawnROI_NIML().
01540 {
01541 static char FuncName[]={"SUMA_DeleteROI"};
01542 SUMA_ASSEMBLE_LIST_STRUCT *ALS = NULL;
01543 SUMA_DRAWN_ROI *NextROI=NULL;
01544 int i;
01545 SUMA_Boolean WasCurrent = NOPE, Shaded = NOPE;
01546 SUMA_Boolean LocalHead = NOPE;
01547
01548 SUMA_ENTRY;
01549
01550 if (!ROI) {
01551 SUMA_LH("Null ROI");
01552 SUMA_RETURN(YUP);
01553 }
01554
01555 /* form a list of the current ROI available for editing */
01556
01557 /* assemble the ROI list */
01558 ALS = SUMA_AssembleAllROIList (SUMAg_DOv, SUMAg_N_DOv, YUP);
01559
01560 NextROI = NULL;
01561 if (ALS) {
01562 if (ALS->N_clist) {
01563 i=0;
01564 while (!NextROI && i<ALS->N_clist) {
01565 if (ALS->oplist[i] != (void*)ROI)
01566 NextROI = (SUMA_DRAWN_ROI *)ALS->oplist[i];
01567 ++i;
01568 }
01569 }
01570 SUMA_FreeAssembleListStruct(ALS);
01571 }
01572
01573 /* check to see if ROI being deleted is current one */
01574 if (ROI == SUMAg_CF->X->DrawROI->curDrawnROI) {
01575 WasCurrent = YUP;
01576 }else {
01577 WasCurrent = NOPE;
01578 }
01579
01580 /* Close the ROIlist window if it is open */
01581 SUMA_IS_DRAW_ROI_SWITCH_ROI_SHADED(Shaded);
01582 if (!Shaded) {
01583 if (LocalHead) fprintf (SUMA_STDERR, "%s: Closing switch ROI window ...\n", FuncName);
01584 SUMA_cb_CloseSwitchROI(NULL, (XtPointer) SUMAg_CF->X->DrawROI->SwitchROIlst, NULL);
01585 }
01586
01587 /* remove ROI for SUMAg_DO and clear the ROI structure*/
01588 if (!SUMA_RemoveDO(SUMAg_DOv, &SUMAg_N_DOv, (void *)ROI, YUP)) {
01589 SUMA_SLP_Err("Failed to remove DO from list.");
01590 SUMA_RETURN(NOPE);
01591 }
01592
01593 if (WasCurrent) {
01594 SUMAg_CF->X->DrawROI->curDrawnROI = NextROI;
01595
01596 /* reinitialize the draw ROI window */
01597 SUMA_InitializeDrawROIWindow(SUMAg_CF->X->DrawROI->curDrawnROI);
01598 }
01599
01600 SUMA_RETURN(YUP);
01601 }
|
|
||||||||||||||||
|
searches all DO objects with an idcode_str for idcode YUP if found, NOPE if not Definition at line 618 of file SUMA_DOmanip.c. References i, SUMA_SegmentDO::idcode_str, SUMA_Axis::idcode_str, SUMA_ROI::idcode_str, SUMA_DRAWN_ROI::idcode_str, SUMA_SurfaceObject::idcode_str, SUMA_Boolean, SUMA_ENTRY, and SUMA_RETURN. Referenced by SUMA_OpenDrawnROI_NIML().
00619 {
00620 static char FuncName[]={"SUMA_existDO"};
00621 int i;
00622 SUMA_SurfaceObject *SO = NULL;
00623 SUMA_DRAWN_ROI *dROI = NULL;
00624 SUMA_ROI *ROI = NULL;
00625 SUMA_SegmentDO *sdo = NULL;
00626 SUMA_Axis *sax = NULL;
00627
00628 SUMA_ENTRY;
00629
00630 if (idcode == NULL) {
00631 fprintf(SUMA_STDERR,"Warning %s: NULL idcode.\n", FuncName);
00632 SUMA_RETURN (NOPE);
00633 }
00634 for (i=0; i< N_dov; ++i) {
00635 switch (dov[i].ObjectType) {
00636 case (SO_type):
00637 SO = (SUMA_SurfaceObject *)dov[i].OP;
00638 if (strcmp(idcode, SO->idcode_str)== 0) {
00639 SUMA_RETURN (YUP);
00640 }
00641 break;
00642 case (ROIdO_type):
00643 dROI = (SUMA_DRAWN_ROI *)dov[i].OP;
00644 if (strcmp(idcode, dROI->idcode_str)== 0) {
00645 SUMA_RETURN (YUP);
00646 }
00647 break;
00648 case (ROIO_type):
00649 ROI = (SUMA_ROI *)dov[i].OP;
00650 if (strcmp(idcode, ROI->idcode_str)== 0) {
00651 SUMA_RETURN (YUP);
00652 }
00653 break;
00654 case (AO_type):
00655 sax = (SUMA_Axis *)dov[i].OP;
00656 if (strcmp(idcode, sax->idcode_str)== 0) {
00657 SUMA_RETURN (YUP);
00658 }
00659 break;
00660 case (LS_type):
00661 sdo = (SUMA_SegmentDO *)dov[i].OP;
00662 if (strcmp(idcode, sdo->idcode_str)== 0) {
00663 SUMA_RETURN (YUP);
00664 }
00665 break;
00666 default:
00667 fprintf(SUMA_STDERR,"Warning %s: Object type %d not checked.\n", FuncName, dov[i].ObjectType);
00668 break;
00669 }
00670 }
00671 SUMA_RETURN(NOPE);
00672 }
|
|
||||||||||||||||
|
searches all SO_type DO objects for idcode YUP if found, NOPE if not Definition at line 590 of file SUMA_DOmanip.c. References i, SUMA_SurfaceObject::idcode_str, SO_type, SUMA_Boolean, SUMA_ENTRY, and SUMA_RETURN. Referenced by SUMA_LoadSpec_eng().
00591 {
00592 static char FuncName[]={"SUMA_existSO"};
00593 SUMA_SurfaceObject *SO;
00594 int i;
00595
00596 SUMA_ENTRY;
00597
00598 if (idcode == NULL) {
00599 fprintf(SUMA_STDERR,"Warning SUMA_existSO: NULL idcode.\n");
00600 SUMA_RETURN (NOPE);
00601 }
00602 for (i=0; i< N_dov; ++i) {
00603 if (dov[i].ObjectType == SO_type) {
00604 SO = (SUMA_SurfaceObject *)dov[i].OP;
00605 if (strcmp(idcode, SO->idcode_str)== 0) {
00606 SUMA_RETURN (YUP);
00607 }
00608 }
00609 }
00610 SUMA_RETURN(NOPE);
00611 }
|
|
||||||||||||||||
|
Returns an ROI that is related to SO and is in InCreation (being actively drawn) DrawStatus There should only be one ROI in creation at any one time for a group of related surfaces. ROI = SUMA_ ROI_InCreation (SO, dov, N_dov);
Definition at line 1311 of file SUMA_DOmanip.c. References SUMA_DRAWN_ROI::DrawStatus, i, ROIdO_type, SUMA_ENTRY, SUMA_isdROIrelated(), SUMA_RETURN, and SUMA_ROI_InCreation. Referenced by SUMA_Engine(), and SUMA_ProcessBrushStroke().
01312 {
01313 int i;
01314 SUMA_DRAWN_ROI *ROI = NULL;
01315 static char FuncName[]={"SUMA_FetchROI_InCreation"};
01316
01317 SUMA_ENTRY;
01318
01319 for (i=0; i < N_dov; ++i) {
01320 if (dov[i].ObjectType == ROIdO_type) {
01321 ROI = (SUMA_DRAWN_ROI *)dov[i].OP;
01322 if (ROI->DrawStatus == SUMA_ROI_InCreation) {
01323 if (SUMA_isdROIrelated (ROI, SO)) {
01324 /* found an ROI, should be the only one, return */
01325 SUMA_RETURN (ROI);
01326 }
01327 }
01328 }
01329 }
01330 SUMA_RETURN (NULL);
01331 }
|
|
||||||||||||||||
|
SO = SUMA_find_named_SOp_inDOv(char *idcode, SUMA_DO *dov, int N_dov) searches all SO_type DO objects for idcode
Definition at line 815 of file SUMA_DOmanip.c. References SUMA_FileName::FileName, SUMA_SurfaceObject::FileType, i, SUMA_SurfaceObject::Name, SUMA_SurfaceObject::Name_coord, SO_type, SUMA_ENTRY, SUMA_free, SUMA_FREE_SURFER, SUMA_FREE_SURFER_PATCH, SUMA_INVENTOR_GENERIC, SUMA_OPENDX_MESH, SUMA_PLY, SUMA_RETURN, SUMA_SL_Err, SUMA_SS2S, SUMA_StringAppend_va(), SUMA_SUREFIT, and SUMA_VEC.
00816 {
00817 static char FuncName[]={"SUMA_find_named_SOp_inDOv"};
00818 SUMA_SurfaceObject *SO = NULL, *SOf = NULL;
00819 SUMA_STRING *SS=NULL;
00820 char *stmp=NULL;
00821 int i;
00822
00823 SUMA_ENTRY;
00824
00825 i=0;
00826 SOf = NULL;
00827 while (i<N_dov) {
00828 if (dov[i].ObjectType == SO_type) {
00829 SO = (SUMA_SurfaceObject *)dov[i].OP;
00830 switch(SO->FileType) {
00831 case SUMA_SUREFIT:
00832 case SUMA_VEC:
00833 if (strstr(SO->Name_coord.FileName, coordname)) {
00834 if (SOf) {
00835 SS = SUMA_StringAppend_va(NULL, NULL);
00836 SS = SUMA_StringAppend_va(SS,
00837 "Error %s:\n"
00838 "Surface name %s\n"
00839 "is not a unique identifier.\n"
00840 "Found %s and %s so far.\n"
00841 "Be more specific.\n", FuncName,
00842 coordname, SOf->Name_coord.FileName,
00843 SO->Name_coord.FileName);
00844 SUMA_SS2S(SS, stmp);
00845 SUMA_SL_Err(stmp); if (stmp) SUMA_free(stmp); stmp = NULL;
00846 SUMA_RETURN(NULL);
00847 }
00848 SOf = SO;
00849 }
00850 break;
00851 case SUMA_FREE_SURFER:
00852 case SUMA_FREE_SURFER_PATCH:
00853 case SUMA_INVENTOR_GENERIC:
00854 case SUMA_OPENDX_MESH:
00855 case SUMA_PLY:
00856 if (strstr(SO->Name.FileName, coordname)) {
00857 if (SOf) {
00858 SS = SUMA_StringAppend_va(NULL, NULL);
00859 SS = SUMA_StringAppend_va(SS,
00860 "Error %s:\n"
00861 "Surface name %s\n"
00862 "is not a unique identifier.\n"
00863 "Found %s and %s so far.\n"
00864 "Be more specific.\n", FuncName,
00865 coordname, SOf->Name_coord.FileName,
00866 SO->Name_coord.FileName);
00867 SUMA_SS2S(SS, stmp);
00868 SUMA_SL_Err(stmp); if (stmp) SUMA_free(stmp); stmp = NULL;
00869 SUMA_RETURN(NULL);
00870 }
00871 SOf = SO;
00872 }
00873 break;
00874 default:
00875 SUMA_SL_Err("Type not supported.");
00876 SUMA_RETURN(NULL);
00877 }
00878 }
00879 ++i;
00880 }
00881
00882 SUMA_RETURN(SOf);
00883 }
|
|
||||||||||||||||
|
ans = SUMA_findSO_inDOv(idcode, dov, N_dov); searches all SO_type DO objects for idcode
Definition at line 747 of file SUMA_DOmanip.c. References i, SUMA_SurfaceObject::idcode_str, LocalHead, SO_type, SUMA_Boolean, SUMA_ENTRY, and SUMA_RETURN. Referenced by SUMA_Engine(), SUMA_input(), SUMA_JumpIndex(), SUMA_LoadSpec_eng(), SUMA_MarkLineSurfaceIntersect(), SUMA_MixColors(), SUMA_NewSurfaceGeometry(), SUMA_NextSO(), SUMA_process_NIML_data(), SUMA_RedisplayAllShowing(), SUMA_SetLocalRemixFlag(), SUMA_SetRemixFlag(), SUMA_SwitchState(), SUMA_XYZ_XYZmap(), and SUMA_XYZmap_XYZ().
00748 {
00749 static char FuncName[]={"SUMA_findSO_inDOv"};
00750 SUMA_SurfaceObject *SO;
00751 int i;
00752 SUMA_Boolean LocalHead = NOPE;
00753
00754 SUMA_ENTRY;
00755
00756 for (i=0; i<N_dov; ++i) {
00757 if (dov[i].ObjectType == SO_type) {
00758 SO = (SUMA_SurfaceObject *)dov[i].OP;
00759 if (LocalHead) fprintf (SUMA_STDERR, "%s: Comparing \n\t:%s:to\n\t:%s:\n", \
00760 FuncName, idcode, SO->idcode_str);
00761 if (strcmp(idcode, SO->idcode_str)== 0) {
00762 SUMA_RETURN (i);
00763 }
00764 }
00765 }
00766 SUMA_RETURN(-1);
00767 }
|
|
||||||||||||||||
|
SO = SUMA_findSOp_inDOv(char *idcode, SUMA_DO *dov, int N_dov) searches all SO_type DO objects for idcode
Definition at line 781 of file SUMA_DOmanip.c. References i, SUMA_SurfaceObject::idcode_str, SO_type, SUMA_ENTRY, and SUMA_RETURN. Referenced by SUMA_1DROI_to_DrawnROI(), SUMA_AssembleAllROIList(), SUMA_cb_createSurfaceCont(), SUMA_cb_DrawROI_Delete(), SUMA_cb_DrawROI_Finish(), SUMA_cb_DrawROI_Join(), SUMA_cb_DrawROI_Redo(), SUMA_cb_DrawROI_Undo(), SUMA_DrawROI_NewValue(), SUMA_FinishedROI(), SUMA_InitializeDrawROIWindow(), SUMA_isdROIrelated(), SUMA_isROIrelated(), SUMA_OpenDrawnROI(), SUMA_process_NIML_data(), and SUMA_SaveDrawnROI().
00782 {
00783 static char FuncName[]={"SUMA_findSOp_inDOv"};
00784 SUMA_SurfaceObject *SO;
00785 int i;
00786
00787 SUMA_ENTRY;
00788
00789 for (i=0; i<N_dov; ++i) {
00790 if (dov[i].ObjectType == SO_type) {
00791 SO = (SUMA_SurfaceObject *)dov[i].OP;
00792 if (strcmp(idcode, SO->idcode_str)== 0) {
00793 SUMA_RETURN (SO);
00794 }
00795 }
00796 }
00797 SUMA_RETURN(NULL);
00798 }
|
|
|
Free a Displayable Object data structure Definition at line 231 of file SUMA_DOmanip.c. References AO_type, GO_type, LS_type, SUMA_DO::ObjectType, SUMA_DO::OP, ROIdO_type, ROIO_type, SO_type, SUMA_Boolean, SUMA_ENTRY, SUMA_Free_Axis(), SUMA_free_SegmentDO(), SUMA_Free_Surface_Object(), SUMA_freeDrawnROI(), SUMA_freeROI(), and SUMA_RETURN. Referenced by SUMA_Free_Displayable_Object_Vect(), and SUMA_RemoveDO().
00232 {
00233 static char FuncName[]={"SUMA_Free_Displayable_Object"};
00234
00235 SUMA_ENTRY;
00236
00237 switch (dov->ObjectType) {
00238 case SO_type:
00239 if (!SUMA_Free_Surface_Object ((SUMA_SurfaceObject *)dov->OP)) {
00240 fprintf(SUMA_STDERR,"Error SUMA_Free_Displayable_Object, could not free surface\n");
00241 }
00242 break;
00243 case ROIdO_type:
00244 if (!SUMA_freeDrawnROI ((SUMA_DRAWN_ROI *)dov->OP)) {
00245 fprintf(SUMA_STDERR,"Error SUMA_freeDrawnROI, could not free ROI.\n");
00246 }
00247 break;
00248 case ROIO_type:
00249 if (!SUMA_freeROI ((SUMA_ROI *)dov->OP)) {
00250 fprintf(SUMA_STDERR,"Error SUMA_freeROI, could not free ROI.\n");
00251 }
00252 break;
00253 case LS_type:
00254 SUMA_free_SegmentDO ((SUMA_SegmentDO *)dov->OP);
00255 break;
00256 case AO_type:
00257 SUMA_Free_Axis((SUMA_Axis*)dov->OP);
00258 break;
00259 case GO_type:
00260 fprintf(SUMA_STDERR,"Error SUMA_Free_Displayable_Object, Not trained to free GO objects\n");
00261 break;
00262
00263 }
00264
00265 SUMA_RETURN(YUP);
00266 }
|
|
||||||||||||
|
Definition at line 268 of file SUMA_DOmanip.c. References i, SUMA_Boolean, SUMA_ENTRY, SUMA_free, SUMA_Free_Displayable_Object(), and SUMA_RETURN. Referenced by final_clean_up(), final_cleanup(), and main().
00269 {
00270 static char FuncName[] = {"SUMA_Free_Displayable_Object_Vect"};
00271 int i;
00272 SUMA_Boolean Ret = YUP;
00273
00274 SUMA_ENTRY;
00275
00276 for (i=0; i < N; ++i) {
00277 if (&dov[i] != NULL) {
00278 Ret = Ret * SUMA_Free_Displayable_Object (&dov[i]);
00279 }
00280 }
00281
00282 if (dov) SUMA_free(dov);
00283 SUMA_RETURN(Ret);
00284
00285 }
|
|
|
|
|
frees SUMA_ASSEMBLE_LIST_STRUCT *
Definition at line 1277 of file SUMA_DOmanip.c. References SUMA_ASSEMBLE_LIST_STRUCT::clist, i, SUMA_ASSEMBLE_LIST_STRUCT::N_clist, SUMA_ASSEMBLE_LIST_STRUCT::oplist, SUMA_ENTRY, SUMA_free, and SUMA_RETURN. Referenced by SUMA_cb_DrawROI_SwitchROI(), SUMA_cb_ViewerCont_SwitchGroup(), SUMA_CmapSelectList(), SUMA_DeleteROI(), SUMA_FreeScrolledList(), and SUMA_RefreshDsetList().
01278 {
01279 static char FuncName[]={"SUMA_FreeAssembleListStruct"};
01280 int i;
01281
01282 SUMA_ENTRY;
01283
01284 if (!str) SUMA_RETURN(NULL);
01285
01286 if (str->clist) {
01287 for (i=0; i < str->N_clist; ++i)
01288 if (str->clist[i]) SUMA_free(str->clist[i]);
01289 SUMA_free(str->clist);
01290 }
01291 if (str->oplist) SUMA_free(str->oplist);
01292 SUMA_free(str);
01293
01294 SUMA_RETURN(NULL);
01295 }
|
|
||||||||||||||||||||
|
returns a vector of indices into dov for DO that meet DO_Type You should free the returned pointer once you're done with it N contains the number of elements found Definition at line 559 of file SUMA_DOmanip.c. References i, LocalHead, SUMA_Boolean, SUMA_calloc, SUMA_DO_Types, SUMA_ENTRY, SUMA_MAX_DISPLAYABLE_OBJECTS, and SUMA_RETURN. Referenced by SUMA_input().
00560 {
00561 static char FuncName[]={"SUMA_GetDO_Type"};
00562 int *do_id, i;
00563 SUMA_Boolean LocalHead = NOPE;
00564
00565 SUMA_ENTRY;
00566
00567 *N = 0;
00568
00569 do_id = (int *)SUMA_calloc (SUMA_MAX_DISPLAYABLE_OBJECTS, sizeof(int));
00570
00571 if (do_id == NULL) {
00572 fprintf(stderr,"Error SUMA_GetDO_Type: Could not allocate for do_id\n");
00573 SUMA_RETURN(NULL);
00574 }
00575 i = 0;
00576 while (i < N_dov) {
00577 if (dov[i].ObjectType == DO_Type) {
00578 do_id[*N] = i;
00579 *N = *N + 1;
00580 }
00581 ++i;
00582 }
00583 SUMA_RETURN(do_id);
00584 }
|
|
||||||||||||
|
Returns YUP if the surface: dROI->Parent_idcode_str is related to SO->idcode_str or SO->LocalDomainParentID. NOPE otherwise. ans = SUMA_isdROIrelated (dROI, SO);
Definition at line 1344 of file SUMA_DOmanip.c. References SUMA_SurfaceObject::idcode_str, SUMA_SurfaceObject::LocalDomainParentID, LocalHead, SUMA_DRAWN_ROI::Parent_idcode_str, SUMA_Boolean, SUMA_ENTRY, SUMA_findSOp_inDOv(), SUMA_isRelated(), SUMA_RETURN, SUMA_SL_Err, and SUMAg_N_DOv. Referenced by SUMA_Build_Mask_AllROI(), SUMA_Draw_SO_ROI(), SUMA_FetchROI_InCreation(), SUMA_Find_ROIrelatedtoSO(), SUMA_FlushPlaneNotInUse(), SUMA_Paint_SO_ROIplanes(), and SUMA_ProcessBrushStroke().
01345 {
01346 static char FuncName[]={"SUMA_isdROIrelated"};
01347 SUMA_SurfaceObject *SO_ROI = NULL;
01348 SUMA_Boolean LocalHead = NOPE;
01349
01350 SUMA_ENTRY;
01351
01352 if (LocalHead) {
01353 fprintf (SUMA_STDERR, "%s: %s SO->LocalDomainParentID\n", FuncName, SO->LocalDomainParentID);
01354 fprintf (SUMA_STDERR, "%s: %s ROI->Parent_idcode_str\n", FuncName, ROI->Parent_idcode_str);
01355 fprintf (SUMA_STDERR, "%s: %s SO->idcode_str\n", FuncName, SO->idcode_str);
01356 }
01357
01358 /* find the pointer to the surface having for an idcode_str: ROI->Parent_idcode_str */
01359 SO_ROI = SUMA_findSOp_inDOv(ROI->Parent_idcode_str, SUMAg_DOv, SUMAg_N_DOv);
01360
01361 if (!SO_ROI) {
01362 SUMA_SL_Err("Could not find surface of ROI->Parent_idcode_str");
01363 SUMA_RETURN (NOPE);
01364 }
01365
01366 if (SUMA_isRelated (SO, SO_ROI, 1)) { /* relationship of the 1st order only */
01367 SUMA_RETURN (YUP);
01368 }
01369
01370 SUMA_RETURN (NOPE);
01371 }
|
|
|
Left here temporarily for backward compatibility use the more appropriately named SUMA_isLocalDomainParent Definition at line 911 of file SUMA_DOmanip.c. References SUMA_Boolean, SUMA_ENTRY, SUMA_isLocalDomainParent(), and SUMA_RETURN.
00912 {
00913 static char FuncName[]={"SUMA_isINHmappable"};
00914
00915 SUMA_ENTRY;
00916
00917 SUMA_RETURN(SUMA_isLocalDomainParent(SO));
00918 }
|
|
||||||||||||
|
This function determines if an Inode in a SO is a link or not. an Inode is a link if IN->ParentIDcode and HolderIDcode are different. The function is nothing more than a strcmp. SUMA_Boolean SUMA_isInodeLink (SUMA_INODE *IN, const char *HolderIDcode) returns NOPE if IN == NULL or IN->ParentIDcode != HolderIDcode Definition at line 65 of file SUMA_DOmanip.c. References SUMA_INODE::ParentIDcode, SUMA_Boolean, SUMA_ENTRY, and SUMA_RETURN. Referenced by SUMA_BreakInodeLink().
00066 {
00067 static char FuncName[] = {"SUMA_isInodeLink"};
00068
00069 SUMA_ENTRY;
00070
00071 if (!IN) {
00072 fprintf (SUMA_STDERR, "Warning %s: IN is null.\n", FuncName);
00073 SUMA_RETURN(NOPE);
00074 }
00075 if (!strcmp(IN->ParentIDcode, HolderIDcode)) SUMA_RETURN(YUP);
00076
00077 SUMA_RETURN(NOPE);
00078 }
|
|
|
determines if a Surface Object is a local domain parent (ie LocalDomainParentID == idcode_str) (used to be called inherently mappable) ans = SUMA_isLocalDomainParent (SUMA_SurfaceObject *SO)
Definition at line 929 of file SUMA_DOmanip.c. References SUMA_SurfaceObject::idcode_str, SUMA_SurfaceObject::LocalDomainParentID, SUMA_Boolean, SUMA_ENTRY, and SUMA_RETURN. Referenced by SUMA_FormSOListToSendToAFNI(), SUMA_input(), SUMA_iRGB_to_OverlayPointer(), SUMA_isINHmappable(), SUMA_SurfaceObject_Info(), SUMA_XYZ_XYZmap(), and SUMA_XYZmap_XYZ().
00930 {
00931 static char FuncName[]={"SUMA_isLocalDomainParent"};
00932
00933 SUMA_ENTRY;
00934
00935 if (SO->LocalDomainParentID == NULL) {
00936 SUMA_RETURN (NOPE);
00937 }
00938 if (strcmp(SO->LocalDomainParentID, SO->idcode_str) == 0) {
00939 /* SO is the local domain parent */
00940 SUMA_RETURN (YUP);
00941 }
00942 SUMA_RETURN (NOPE);
00943 }
|
|
|
determines if a Surface Object is mappable (ie LocalDomainParentID != NULL) ans = SUMA_ismappable (SUMA_SurfaceObject *SO)
Definition at line 891 of file SUMA_DOmanip.c. References SUMA_SurfaceObject::LocalDomainParentID, SUMA_Boolean, SUMA_ENTRY, and SUMA_RETURN. Referenced by SUMA_MapRefRelative(), SUMA_SurfaceObject_Info(), SUMA_XYZ_XYZmap(), and SUMA_XYZmap_XYZ().
00892 {
00893 static char FuncName[]={"SUMA_ismappable"};
00894
00895 SUMA_ENTRY;
00896
00897 if (SO->LocalDomainParentID != NULL) {
00898 /* SO is mappable */
00899 SUMA_RETURN (YUP);
00900 }
00901
00902 SUMA_RETURN (NOPE);
00903
00904 }
|
|
||||||||||||||||
|
ans = SUMA_isRelated (SUMA_SurfaceObject *SO1, SUMA_SurfaceObject *SO2, int level); returns YUP if SO1 and SO2 are related at level 1 or 2 level 1 means nuclear family (share the same parent) level 2 means extended family (share a grandparent, ultimately this could be the grand icosahedron duc Surfaces must be the of the same hemi side since both hemispheres can have the same grandparent, use level 3 if you want to go across hemis.) level 3 is like level 2 with no care for what side of the brain we're working with For more definitions on relationships:
Definition at line 959 of file SUMA_DOmanip.c. References LocalHead, SUMA_SurfaceObject::Side, SUMA_Boolean, SUMA_DOMAIN_KINSHIPS, SUMA_DOMAINS_NOT_RELATED, SUMA_ENTRY, SUMA_NUCELAR_FAMILY, SUMA_RETURN, SUMA_SL_Err, and SUMA_WhatAreYouToMe(). Referenced by SUMA_AddNewPlane(), SUMA_Engine(), SUMA_GetOverlaysFromParent(), SUMA_isdROIrelated(), SUMA_isROIrelated(), SUMA_MapRefRelative(), SUMA_SetLocalRemixFlag(), SUMA_SetRemixFlag(), and SUMA_UpdateColPlaneShellAsNeeded().
00960 {
00961 static char FuncName[]={"SUMA_isRelated"};
00962 SUMA_DOMAIN_KINSHIPS kin;
00963 SUMA_Boolean LocalHead = NOPE;
00964
00965 SUMA_ENTRY;
00966
00967 kin = SUMA_WhatAreYouToMe (SO1, SO2);
00968 switch (level) {
00969 case 3: /* anything goes */
00970 if ( (kin > SUMA_DOMAINS_NOT_RELATED) ) SUMA_RETURN(YUP);
00971 break;
00972 case 2: /* share an ancestor, but same side */
00973 if ( (kin > SUMA_DOMAINS_NOT_RELATED) &&
00974 (SO1->Side == SO2->Side) ) SUMA_RETURN(YUP);
00975 break;
00976 case 1: /* nuclear family only */
00977 if ( (kin > SUMA_DOMAINS_NOT_RELATED) &&
00978 (kin < SUMA_NUCELAR_FAMILY ) &&
00979 (SO1->Side == SO2->Side) ) SUMA_RETURN(YUP); /* last condition is not really necessary but it don't hoyt...*/
00980 break;
00981 default:
00982 SUMA_SL_Err("Bad value for level.");
00983 break;
00984 }
00985 SUMA_RETURN(NOPE);
00986 }
|
|
||||||||||||
|
Returns YUP if if the surface: ROI->Parent_idcode_str is related to SO->idcode_str or SO->LocalDomainParentID. NOPE otherwise. ans = SUMA_isROIrelated (ROI, SO);
Definition at line 1384 of file SUMA_DOmanip.c. References SUMA_ROI::Parent_idcode_str, SUMA_Boolean, SUMA_ENTRY, SUMA_findSOp_inDOv(), SUMA_isRelated(), SUMA_RETURN, SUMA_SL_Err, and SUMAg_N_DOv. Referenced by SUMA_Build_Mask_AllROI(), and SUMA_Draw_SO_ROI().
01385 {
01386 static char FuncName[]={"SUMA_isROIrelated"};
01387 SUMA_SurfaceObject *SO_ROI = NULL;
01388
01389 SUMA_ENTRY;
01390
01391 /* find the pointer to the surface having for an idcode_str: ROI->Parent_idcode_str */
01392 SO_ROI = SUMA_findSOp_inDOv(ROI->Parent_idcode_str, SUMAg_DOv, SUMAg_N_DOv);
01393
01394 if (!SO_ROI) {
01395 SUMA_SL_Err("Could not find surface of ROI->Parent_idcode_str");
01396 SUMA_RETURN (NOPE);
01397 }
01398
01399 if (SUMA_isRelated (SO, SO_ROI, 1)) { /* relationship of the 1st order only */
01400 SUMA_RETURN (YUP);
01401 }
01402
01403 SUMA_RETURN (NOPE);
01404 }
|
|
||||||||||||||||||||
|
A function to find the skin of a volume.
Definition at line 258 of file SUMA_VolData.c. References DSET_NX, DSET_NY, DSET_NZ, nz, SUMA_3D_2_1D_index, SUMA_calloc, SUMA_ENTRY, SUMA_RETURN, SUMA_SL_Crit, and SUMA_SL_Err. Referenced by SUMA_LoadPrepInVol().
00259 {
00260 static char FuncName[]={"SUMA_isSkin"};
00261 byte *isskin=NULL;
00262 int x, y, z, nx, ny, nz, i1D, nxy;
00263
00264 SUMA_ENTRY;
00265
00266 if (!dset || !dvec) {
00267 SUMA_SL_Err("NULL input dset or dvec");
00268 SUMA_RETURN(isskin);
00269 }
00270
00271 nx = DSET_NX(dset);
00272 ny = DSET_NY(dset);
00273 nz = DSET_NZ(dset);
00274 nxy = nx * ny;
00275
00276 isskin = (byte *) SUMA_calloc(nxy * nz, sizeof(byte));
00277 if (!isskin) {
00278 SUMA_SL_Crit("Failed to allocate");
00279 SUMA_RETURN(NULL);
00280 }
00281
00282 *N_skin = 0;
00283 for (z=0; z<nz; ++z) {
00284 for (y=0; y<ny; ++y) {
00285 x = 0;
00286 do { /* the upstroke */
00287 i1D = SUMA_3D_2_1D_index(x, y, z, nx, nxy);
00288 if (dvec[i1D] > thresh) { isskin[i1D] = 1; ++ *N_skin; }
00289 ++x;
00290 } while (x < nx && !isskin[i1D]);
00291 x = nx - 1;
00292 do { /* the downstroke */
00293 i1D = SUMA_3D_2_1D_index(x, y, z, nx, nxy);
00294 if (dvec[i1D] > thresh) { isskin[i1D] = 1; ++ *N_skin; }
00295 --x;
00296 } while (x >=0 && !isskin[i1D]);
00297 } /* y */
00298 } /* z */
00299
00300 for (z=0; z<nz; ++z) {
00301 for (x=0; x<nx; ++x) {
00302 y = 0;
00303 do { /* the upstroke */
00304 i1D = SUMA_3D_2_1D_index(x, y, z, nx, nxy);
00305 if (dvec[i1D] > thresh) { isskin[i1D] = 1; ++ *N_skin; }
00306 ++y;
00307 } while (y < ny && !isskin[i1D]);
00308 y = ny - 1;
00309 do { /* the downstroke */
00310 i1D = SUMA_3D_2_1D_index(x, y, z, nx, nxy);
00311 if (dvec[i1D] > thresh) { isskin[i1D] = 1; ++ *N_skin; }
00312 --y;
00313 } while (y >=0 && !isskin[i1D]);
00314 } /* x */
00315 } /* z */
00316
00317 for (x=0; x<nx; ++x) {
00318 for (y=0; y<ny; ++y) {
00319 z = 0;
00320 do { /* the upstroke */
00321 i1D = SUMA_3D_2_1D_index(x, y, z, nx, nxy);
00322 if (dvec[i1D] > thresh) { isskin[i1D] = 1; ++ *N_skin; }
00323 ++z;
00324 } while (z < nz && !isskin[i1D]);
00325 z = nz - 1;
00326 do { /* the downstroke */
00327 i1D = SUMA_3D_2_1D_index(x, y, z, nx, nxy);
00328 if (dvec[i1D] > thresh) { isskin[i1D] = 1; ++ *N_skin; }
00329 --z;
00330 } while (z >=0 && !isskin[i1D]);
00331 } /* y */
00332 } /* x */
00333
00334 SUMA_RETURN(isskin);
00335 }
|
|
|
SUMA_Boolean SUMA_isSO (SUMA_DO DO) returns YUP if DO is of SO_type ans = SUMA_isSO (DO) ;.
Definition at line 1108 of file SUMA_DOmanip.c. References SUMA_DO::ObjectType, SO_type, SUMA_Boolean, SUMA_ENTRY, and SUMA_RETURN. Referenced by all_mappable_surfs(), get_mappable_surfs(), SUMA_AddNewPlane(), SUMA_CanTalkToAfni(), SUMA_Engine(), SUMA_FormSOListToSendToAFNI(), SUMA_input(), SUMA_isSO_G(), SUMA_NextSO(), SUMA_RedisplayAllShowing(), SUMA_RegisterDO(), SUMA_RegisterSpecSO(), SUMA_RemoveCoordBias(), SUMA_SetCoordBias(), SUMA_SetRemixFlag(), SUMA_SetupSVforDOs(), SUMA_TransferCoordBias(), SUMA_UnRegisterDO(), and SUMA_UpdateColPlaneShellAsNeeded().
01109 {
01110 static char FuncName[]={"SUMA_isSO"};
01111
01112 SUMA_ENTRY;
01113
01114 if (DO.ObjectType == SO_type) {
01115 SUMA_RETURN (YUP);
01116 }
01117 SUMA_RETURN (NOPE);
01118 }
|
|
||||||||||||
|
SUMA_Boolean SUMA_isSO_G (SUMA_DO DO, char *Group) returns YUP if DO is a surface object and is a part of the group Group.
Definition at line 1081 of file SUMA_DOmanip.c. References SUMA_SurfaceObject::Group, SUMA_DO::OP, SUMA_Boolean, SUMA_ENTRY, SUMA_isSO(), SUMA_RETURN, and SUMA_SL_Err. Referenced by SUMA_input(), SUMA_isVisibleSO(), SUMA_NewSurfaceGeometry(), SUMA_RegisteredSOs(), SUMA_RegisterSpecSO(), SUMA_SwitchGroups(), and SUMA_VisibleSOs().
01082 {
01083 static char FuncName[]={"SUMA_isSO_G"};
01084 SUMA_SurfaceObject *SO = NULL;
01085
01086 SUMA_ENTRY;
01087
01088 if (!Group) {
01089 SUMA_SL_Err("Null Group");
01090 SUMA_RETURN(NOPE);
01091 }
01092
01093 if (SUMA_isSO(DO)) {
01094 SO = (SUMA_SurfaceObject *)DO.OP;
01095 if (strcmp(SO->Group, Group)) { SUMA_RETURN(NOPE); }
01096 else { SUMA_RETURN(YUP); }
01097 }
01098
01099 SUMA_RETURN(NOPE);
01100 }
|
|
|
return +1 if surface is typically the outer layer surface used in Vol2Surf -1 if surface is typically the inner layer surface used in Vol2Surf 0 if no comment
Definition at line 1608 of file SUMA_DOmanip.c. References SUMA_FileName::FileName, SUMA_SurfaceObject::FileType, SUMA_SurfaceObject::Name, SUMA_ENTRY, SUMA_FREE_SURFER, SUMA_iswordin(), and SUMA_RETURN. Referenced by SUMA_FormSOListToSendToAFNI().
01609 {
01610 static char FuncName[]={"SUMA_isTypicalSOforVolSurf"};
01611 SUMA_ENTRY;
01612
01613 switch (SO->FileType) {
01614 case SUMA_FREE_SURFER:
01615 if (SUMA_iswordin (SO->Name.FileName, "smoothwm")) SUMA_RETURN(-1);
01616 else if (SUMA_iswordin (SO->Name.FileName, "pial")) SUMA_RETURN(1);
01617 else SUMA_RETURN(0);
01618 break;
01619 default:
01620 SUMA_RETURN(0);
01621 break;
01622 }
01623
01624 SUMA_RETURN(0);
01625 }
|
|
||||||||||||
|
File : Taken from IV_FaceSetsextract.c Author : Ziad Saad Date : Tue Nov 17 19:02:16 CST 1998 Purpose : Extracts the FaceSets coordinates of the nodes in an IV file so that we can manipulate the data to our liking. The program looks for a sequence of characters that seem to indicate the start of the FaceSets list. Once the sequence is found, the series of triplets is read and written out either to a file or to the screen. The sequence of triplets must be terminated by an ending sequence. The starting and ending sequences are hard coded into the program. The program outputs an error message if : If the starting or ending sequences are not found If the number of points read is not a multiple of three If the first number of the first FaceSets triplet and the last character in the starting sequence are not spearated by a space (or tab). You can fix this by manually adding a space. Input paramters : IV_filename (char *) a string specifying the name of the inventor file N_FaceSetList (int *) will give the number of rows in FaceSetList Usage : FaceSetList = SUMA_IV_FaceSetsextract (char *IV_filename, int *N_FaceSetList) Returns : FaceSetList (int *) the facesetlist in the inventor file, an Mx3 integer vector (used to be a matrix before SUMA 1.2) Support : Side effects : Definition at line 59 of file SUMA_IV_FaceSetsextract.c. References i, SUMA_alloc_problem(), SUMA_calloc, SUMA_error_message(), SUMA_free, SUMA_iswordin(), SUMA_malloc, and SUMA_realloc. Referenced by SUMA_Load_Surface_Object_eng().
00060 {/* SUMA_IV_FaceSetsextract */
00061 char s[500],serr[500];
00062 char seq_strt[5][30], seq_end[5][30];
00063 int i, f, ex, si, si_exit, evl, se, se_exit;
00064 int ip, NP, cnt, nospacing, MaxAlloc = 100, *linv, *FaceSetList;
00065 div_t cnt4;
00066 FILE*iv_file;
00067 static char FuncName[]={"SUMA_IV_FaceSetsextract"};
00068
00069
00070 /* intialize the number of points read to 0 */
00071 *N_FaceSetList = 0;
00072
00073 linv = (int *)SUMA_malloc (MaxAlloc*sizeof(int));
00074 if (!linv)
00075 {
00076 SUMA_alloc_problem ("Allocation error in IV-FaceSetExtract");
00077 return (NULL);
00078 }
00079
00080 /*This is the sequence to trigger reading the numbers*/
00081 sprintf (seq_strt[0],"IndexedFaceSet");
00082 sprintf (seq_strt[1],"{");
00083 sprintf (seq_strt[2],"coordIndex");
00084 sprintf (seq_strt[3],"[");
00085
00086 si_exit = 4; /* set equal to the number of strings to be matched */
00087
00088 /*This is a sequence to mark the end of the number list*/
00089 sprintf (seq_end[0],"]");
00090 sprintf (seq_end[1],"}"); /* you do not need that one, it is possible to have other objects following coordIndex */
00091
00092 se_exit = 1; /* set equal to the number of strings to be matched */
00093
00094 iv_file = fopen (IV_filename,"r");
00095 if (iv_file == NULL)
00096 {
00097 SUMA_error_message ("SUMA_IV_FaceSetsextract","Could not open input file ",1);
00098 return (NULL);
00099 }
00100
00101
00102 si = 0;
00103 ex = 1;
00104 cnt = 0;
00105
00106 nospacing = 0; /* this flag is used to when the last number is read and it has the first seq_end*/
00107 /* character attached to it, ie no space ! in between*/
00108 while (ex != EOF && si < si_exit)
00109 {
00110 ex = fscanf (iv_file,"%s",s);
00111
00112 /*evl = equal_strings (s,seq_strt[si]);*/
00113
00114 if (strlen (seq_strt[si]) >= strlen (s))
00115 {
00116 evl = SUMA_iswordin (seq_strt[si],s);
00117 if (evl == 1)
00118 nospacing = 0; /* There is a space between character in starting sequence and first number*/
00119 }
00120 else
00121 {
00122 evl = SUMA_iswordin (s,seq_strt[si]);
00123 if (evl == 1)
00124 nospacing = 1;
00125 }
00126
00127 switch (evl)
00128 {
00129 case 0:
00130 si = 0; /* No match, reset the sequence counter */
00131 break;
00132 case 1:
00133 if (nospacing == 1 && si == si_exit-1) /* it has to be the last character in the sequence*/
00134 {
00135 sprintf (serr,"Must have a space character between first number and last character in start sequence ( %s )",s);
00136 SUMA_error_message ("SUMA_IV_FaceSetsextract",serr,1);
00137 exit (1);
00138
00139 }
00140 si = si +1; /* increment the start sequence counter */
00141 #ifdef DEBUG_3
00142 printf ("found %s --- si = %d\n",s,si);
00143 #endif
00144 break;
00145 default:
00146 break;
00147 }
00148 }
00149
00150 /* Now, read the series of numbers until you encounter the first string of the ending sequence*/
00151 se = 0;
00152 nospacing = 0;
00153
00154 while (ex != EOF && se < se_exit )
00155 {
00156 ex = fscanf (iv_file,"%s",s);
00157 /*evl = equal_strings (s,seq_end[se]);*/
00158
00159 if (strlen (seq_end[se]) >= strlen (s))
00160 {
00161 evl = SUMA_iswordin (seq_end[se],s);
00162 if (evl == 1)
00163 nospacing = 0; /* There is a space between last number and fisrt character in ending sequence */
00164 }
00165 else
00166 {
00167 evl = SUMA_iswordin (s,seq_end[se]);
00168 if (evl == 1)
00169 nospacing = 1;
00170 }
00171
00172 switch (evl)
00173 {
00174 case 0:
00175 f = atoi (s);
00176 linv[cnt] = f;
00177 #ifdef DEBUG_3
00178 printf ("\nNumber (%d): %d is appended to end sequence !\n",cnt,linv[cnt]);
00179 #endif
00180
00181 ++cnt;
00182 if (cnt >= MaxAlloc - 1)
00183 {
00184 MaxAlloc = MaxAlloc + 100;
00185 linv = (int *)SUMA_realloc ((void*) linv, MaxAlloc * sizeof(int));
00186 if (!linv)
00187 {
00188 SUMA_alloc_problem ("Re-Allocation error in IV-FaceSetExtract");
00189 return (NULL);
00190 }
00191
00192 }
00193 se = 0; /* no match for ending sequence, reset the counter */
00194 break;
00195 case 1: /* found the first character in the end sequence */
00196 if (nospacing == 1 && se == 0) /* it has to be the first character in the sequence*/
00197 {
00198 f = atoi (s);
00199 linv[cnt] = f;
00200
00201 ++cnt;
00202 #ifdef DEBUG_3
00203 printf ("\nLast number (%d): %f is appended to end sequence !\n",cnt,f);
00204 #endif
00205 }
00206 #ifdef DEBUG_3
00207 printf ("\nfound %s --- se = %d\n",s,se);
00208 #endif
00209 se = se + 1;
00210 break;
00211 default:
00212 break;
00213 }
00214
00215 }
00216 if (si < si_exit)
00217 {
00218 SUMA_error_message ("IV_FaceSetextract","Could not find specified starting sequence",0);
00219 for (i=0;i<si_exit;++i)
00220 printf ("%s \t",seq_strt[i]);
00221 }
00222 else
00223 {
00224 if (se < se_exit)
00225 {
00226 SUMA_error_message ("IV_FaceSetextract","Could not find specified ending sequence",0);
00227 for (i=0;i<se_exit;++i)
00228 printf ("%s \t",seq_end[i]);
00229 }
00230 else
00231 {
00232 /* check that the number of points read is multiple of 4 */
00233 cnt4 = div (cnt,4);
00234 if (cnt4.rem != 0)
00235 {
00236 SUMA_error_message ("IV_FaceSetextract","number of points read is not multiple of 4 !",0);
00237 #ifdef DEBUG_3
00238 printf ("%f FaceSets sets read !!!\n",(float)cnt/4);
00239 #endif
00240 }
00241
00242 }
00243 }
00244
00245 *N_FaceSetList = cnt4.quot ;
00246
00247 /* Now allocate space for SUMA_IV_FaceSetsextract and fill it up */
00248 NP = 3;
00249 FaceSetList = (int *) SUMA_calloc (*N_FaceSetList * NP, sizeof(int));
00250 if (!FaceSetList)
00251 {
00252 SUMA_alloc_problem("IV_FaceSetextract : Could not allocate");
00253 return(NULL);
00254 }
00255
00256 i = 0;
00257 ip = 0;
00258 while (i < cnt) {
00259 FaceSetList[ip] = linv[i]; ++ip; ++i;
00260 FaceSetList[ip] = linv[i]; ++ip; ++i;
00261 FaceSetList[ip] = linv[i]; ++ip; ++i;
00262 ++i; /* skip the 4th value */
00263 }
00264
00265 fclose (iv_file);
00266
00267 SUMA_free(linv);
00268
00269 return (FaceSetList);
00270
00271 }/* SUMA_IV_FaceSetsextract */
|
|
||||||||||||||||
|
File :Taken from IV_XYZextract.c Author : Ziad Saad Date : Tue Nov 17 19:02:16 CST 1998 Purpose : Extracts the XYZ coordinates of the nodes in an IV file so that we can manipulate the data to our liking. The program looks for a sequence of characters that seem to indicate the start of the XYZ list. Once the sequence is found, the series of triplets is read and written out either to a file or to the screen. The sequence of triplets must be terminated by an ending sequence. The starting and ending sequences are hard coded into the program. The program outputs an error message if : If the starting or ending sequences are not found If the number of points read is not a multiple of three If the first number of the first XYZ triplet and the last character in the starting sequence are not spearated by a space (or tab). You can fix this by manually adding a space. Input paramters : IV_filename (char *) a string specifying the name of the inventor file N_NodeList (int *) will give the number of nodes in NodeList / 3 or /4 Include_Index (int) (0/1) controls the output of the function, see ahead for info Usage : NodeList = SUMA_IV_XYZextract (char *IV_filename, int *N_NodeList, int Include_Index) Returns : NodeList (float *) an Mx3 (or Mx4) vector containing the X Y Z coordinates of each node (with Include_Index = 0) or NodeIndex X Y Z coordinates of each node (with Include_Index = 1) entries on one line are separated by a tab. Support : Side effects : Definition at line 70 of file SUMA_IV_XYZextract.c. References free, i, SUMA_alloc_problem(), SUMA_calloc, SUMA_ENTRY, SUMA_error_message(), SUMA_iswordin(), SUMA_malloc, SUMA_realloc, and SUMA_RETURN. Referenced by SUMA_Load_Surface_Object_eng().
00071 {/* SUMA_IV_XYZextract */
00072 static char FuncName[]={"SUMA_IV_XYZextract"};
00073 char s[500],serr[500];
00074 char seq_strt[5][30], seq_end[5][30];
00075 float f, *linv, *NodeList;
00076 int i, ex, si, si_exit, evl, se, se_exit, cnt, cntlim,i3, i4;
00077 int nospacing, MaxAlloc = 100;
00078 div_t cnt3;
00079 FILE*iv_file;
00080
00081 SUMA_ENTRY;
00082
00083 /* intialize the number of points read to 0 */
00084 *N_NodeList = 0;
00085
00086 linv = (float *)SUMA_malloc (MaxAlloc*sizeof(float));
00087 if (!linv)
00088 {
00089 SUMA_alloc_problem ("Allocation error in SUMA_IV-XYZExtract");
00090 SUMA_RETURN (NULL);
00091 }
00092
00093 /*This is the sequence to trigger reading the numbers*/
00094 sprintf (seq_strt[0],"Coordinate3");
00095 sprintf (seq_strt[1],"{");
00096 sprintf (seq_strt[2],"point");
00097 sprintf (seq_strt[3],"[");
00098
00099 si_exit = 4; /* set equal to the number of strings to be matched */
00100
00101 /*This is a sequence to mark the end of the number list*/
00102 sprintf (seq_end[0],"]");
00103 sprintf (seq_end[1],"}"); /* no need to find closing Coordinate element, perhaps other properties are defined.*/
00104
00105 se_exit = 1; /* set equal to the number of strings to be matched */
00106
00107 iv_file = fopen (IV_filename,"r");
00108 if (iv_file == NULL)
00109 {
00110 SUMA_error_message ("SUMA_IV_XYZextract","Could not open input file ",1);
00111 exit (1);
00112 }
00113
00114
00115 si = 0;
00116 ex = 1;
00117 cnt = 0;
00118
00119 nospacing = 0; /* this flag is used to when the last number is read and it has the first seq_end*/
00120 /* character attached to it, ie no space ! in between*/
00121 while (ex != EOF && si < si_exit)
00122 {
00123 ex = fscanf (iv_file,"%s",s);
00124
00125 /*evl = equal_strings (s,seq_strt[si]);*/
00126
00127 if (strlen (seq_strt[si]) >= strlen (s))
00128 {
00129 evl = SUMA_iswordin (seq_strt[si],s);
00130 if (evl == 1)
00131 nospacing = 0; /* There is a space between character in starting sequence and first number*/
00132 }
00133 else
00134 {
00135 evl = SUMA_iswordin (s,seq_strt[si]);
00136 if (evl == 1)
00137 nospacing = 1;
00138 }
00139
00140 switch (evl)
00141 {
00142 case 0:
00143 si = 0; /* No match, reset the sequence counter */
00144 break;
00145 case 1:
00146 if (nospacing == 1 && si == si_exit-1) /* it has to be the last character in the sequence*/
00147 {
00148 sprintf (serr,"Must have a space character between first number and last character in start sequence ( %s )",s);
00149 SUMA_error_message ("SUMA_IV_XYZextract",serr,1);
00150 exit (1);
00151
00152 }
00153 si = si +1; /* increment the start sequence counter */
00154 #ifdef DEBUG_3
00155 printf ("found %s --- si = %d\n",s,si);
00156 #endif
00157 break;
00158 default:
00159 break;
00160 }
00161 }
00162
00163 /* Now, read the series of numbers until you encounter the first string of the ending sequence*/
00164 se = 0;
00165 nospacing = 0;
00166
00167 while (ex != EOF && se < se_exit )
00168 {
00169 ex = fscanf (iv_file,"%s",s);
00170 /*evl = equal_strings (s,seq_end[se]);*/
00171
00172 if (strlen (seq_end[se]) >= strlen (s))
00173 {
00174 evl = SUMA_iswordin (seq_end[se],s);
00175 if (evl == 1)
00176 nospacing = 0; /* There is a space between last number and fisrt character in ending sequence */
00177 }
00178 else
00179 {
00180 evl = SUMA_iswordin (s,seq_end[se]);
00181 if (evl == 1)
00182 nospacing = 1;
00183 }
00184
00185 switch (evl)
00186 {
00187 case 0:
00188 f = atof (s);
00189 linv[cnt] = f;
00190 #ifdef DEBUG_3
00191 printf ("\nNumber (%d): %d is appended to end sequence !\n",cnt,linv[cnt]);
00192 #endif
00193
00194
00195 ++cnt;
00196
00197 if (cnt >= MaxAlloc - 1)
00198 {
00199 MaxAlloc = MaxAlloc + 100;
00200 linv = (float *)SUMA_realloc ((void*) linv, MaxAlloc * sizeof(float));
00201 if (!linv)
00202 {
00203 SUMA_alloc_problem ("Re-Allocation error in IV-FaceSetExtract");
00204 SUMA_RETURN (NULL);
00205 }
00206
00207 }
00208 se = 0; /* no match for ending sequence, reset the counter */
00209 break;
00210 case 1: /* found the first character in the end sequence */
00211 if (nospacing == 1 && se == 0) /* it has to be the first character in the sequence*/
00212 {
00213 f = atof (s);
00214 linv[cnt] = f;
00215
00216 ++cnt;
00217 #ifdef DEBUG_3
00218 printf ("\nLast number (%d): %f is appended to end sequence !\n",cnt,f);
00219 #endif
00220 }
00221 #ifdef DEBUG_3
00222 printf ("\nfound %s --- se = %d\n",s,se);
00223 #endif
00224 se = se + 1;
00225 break;
00226 default:
00227 break;
00228 }
00229
00230 }
00231 if (si < si_exit)
00232 {
00233 SUMA_error_message ("SUMA_IV_XYZextract","Could not find specified starting sequence",0);
00234 for (i=0;i<si_exit;++i)
00235 printf ("%s \t",seq_strt[i]);
00236 }
00237 else
00238 {
00239 if (se < se_exit)
00240 {
00241 SUMA_error_message ("SUMA_IV_XYZextract","Could not find specified ending sequence",0);
00242 for (i=0;i<se_exit;++i)
00243 printf ("%s \t",seq_end[i]);
00244 }
00245 else
00246 {
00247 /* check that the number of points read is multiple of 3 */
00248 cnt3 = div (cnt,3);
00249 if (cnt3.rem != 0)
00250 {
00251 SUMA_error_message ("SUMA_IV_XYZextract","number of points read is not multiple of 3 !",0);
00252 #ifdef DEBUG_3
00253 printf ("%f XYZ sets read !!!\n",(float)cnt/3);
00254 #endif
00255 }
00256 }
00257 }
00258
00259 *N_NodeList = cnt3.quot;
00260
00261 /* Now allocate space for IV_FaceSetsextract and fill it up */
00262 if (!IncludeIndex)
00263 NodeList = (float *) SUMA_calloc (*N_NodeList * 3, sizeof(float));
00264 else
00265 NodeList = (float *) SUMA_calloc (*N_NodeList * 4, sizeof(float));
00266
00267 if (!NodeList)
00268 {
00269 SUMA_alloc_problem("SUMA_IV_XYZextract : Could not allocate");
00270 SUMA_RETURN (NULL);
00271 }
00272
00273 if (!IncludeIndex)
00274 {
00275 for (i=0; i< cnt; ++i)
00276 {
00277 NodeList[i] = linv[i];
00278 }
00279 }
00280 else
00281 {
00282 cntlim = cnt/3;
00283 for (i=0; i < cntlim; ++i)
00284 {
00285
00286 i4 = 4*i;
00287 i3 = 3*i;
00288 NodeList[i4] = i;
00289
00290 NodeList[i4+1] = linv[i3];
00291 NodeList[i4+2] = linv[i3+1];
00292 NodeList[i4+3] = linv[i3+2];
00293
00294 }
00295
00296 }
00297
00298 fclose (iv_file);
00299 free (linv);
00300
00301 SUMA_RETURN (NodeList);
00302
00303
00304 }/* SUMA_IV_XYZextract */
|
|
||||||||||||||||||||||||
|
** File : SUMA_MemberFaceSets.c
Usage : RetStruct = SUMA_MemberFaceSets (int Nind, int * FaceSetList, int nFace, int FaceSetDim); Input paramters :
Support :
and Nind is: 7 Then RetStruct.NodeMemberOfFaceSet is: -1 0 0 ( Node 0 is not used in FaceSetList ) 0 2 -1 (Node 1 is used in Facesets 0 & 2 ) 1 -1 0 (Node 2 is used in Faceset 1) 2 -1 0 (Node 3 is used in Faceset 2) 0 1 -1 (Node 4 is used in Facesets 0 & 1) -1 0 0 (Node 5 in not used in FaceSetList) 0 1 2 (Node 6 is used in all Facesets) and RetStruct.N_Memb is: 0 2 1 1 2 0 3 Side effects : To free RetStruct, use: if (RetStruct.NodeMemberOfFaceSet) SUMA_free2D((char **)RetStruct.NodeMemberOfFaceSet, Nind); if (RetStruct.N_Memb) SUMA_free(RetStruct.N_Memb); if (RetStruct) SUMA_free(RetStrct); Definition at line 303 of file SUMA_SurfNorm.c. References i, SUMA_MEMBER_FACE_SETS::idcode_str, SUMA_MEMBER_FACE_SETS::LinkedPtrType, SUMA_MEMBER_FACE_SETS::N_links, SUMA_MEMBER_FACE_SETS::N_Memb, SUMA_MEMBER_FACE_SETS::N_Memb_max, SUMA_MEMBER_FACE_SETS::Nnode, SUMA_MEMBER_FACE_SETS::NodeMemberOfFaceSet, SUMA_MEMBER_FACE_SETS::owner_id, SUMA_allocate2D(), SUMA_calloc, SUMA_ENTRY, SUMA_free2D(), SUMA_LINKED_MEMB_FACE_TYPE, SUMA_malloc, SUMA_MAX_MEMBER_FACE_SETS, SUMA_NEW_ID, and SUMA_RETURN. Referenced by main(), SUMA_CreateIcosahedron(), and SUMA_SurfaceMetrics_eng().
00304 {/*SUMA_MemberFaceSets*/
00305 static char FuncName[]={"SUMA_MemberFaceSets"};
00306 SUMA_MEMBER_FACE_SETS *RetStrct;
00307 int **tmpMember;
00308 int i, inode, iface, ip , NP;
00309
00310 SUMA_ENTRY;
00311
00312 NP = FaceDim;
00313 RetStrct = (SUMA_MEMBER_FACE_SETS *)SUMA_malloc(sizeof(SUMA_MEMBER_FACE_SETS));
00314 RetStrct->idcode_str = NULL;
00315 SUMA_NEW_ID(RetStrct->idcode_str, NULL);
00316 RetStrct->N_links = 0;
00317 if (ownerid) sprintf(RetStrct->owner_id, "%s", ownerid);
00318 else RetStrct->owner_id[0] = '\0';
00319 RetStrct->LinkedPtrType = SUMA_LINKED_MEMB_FACE_TYPE;
00320
00321 RetStrct->N_Memb_max = RetStrct->Nnode = 0;
00322 RetStrct->N_Memb = NULL;
00323 RetStrct->NodeMemberOfFaceSet = NULL;
00324
00325 /* Allocate return variables */
00326 tmpMember = (int **) SUMA_allocate2D (Nind, SUMA_MAX_MEMBER_FACE_SETS ,sizeof(int));
00327 RetStrct->N_Memb = (int *) SUMA_calloc (Nind, sizeof(int));
00328
00329 if (!tmpMember || !RetStrct->N_Memb)
00330 {
00331 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for tmpMember or RetStrct->N_Memb\n", FuncName);
00332 SUMA_RETURN (RetStrct);
00333 }
00334
00335 /* loop through all facesets and tag nodes that make up FaceSets*/
00336 for (iface=0; iface<nFr; ++iface) {/*iface*/
00337 i = 0;
00338 ip = NP * iface;
00339 do {
00340 inode = FaceSetList[ip + i];
00341 if (inode > Nind) {
00342 fprintf (SUMA_STDERR,"Error %s: FaceSetList contains node indices >= Nind\n", FuncName);
00343 SUMA_RETURN (RetStrct);
00344 }
00345 tmpMember[inode][RetStrct->N_Memb[inode]] = iface;
00346 ++RetStrct->N_Memb[inode];
00347 if (RetStrct->N_Memb[inode] >= SUMA_MAX_MEMBER_FACE_SETS) {
00348 fprintf (SUMA_STDERR,"Error %s: Node %d is member of (%d FaceSets) more than SUMA_MAX_MEMBER_FACE_SETS (%d)\n",\
00349 FuncName, inode, RetStrct->N_Memb[inode], SUMA_MAX_MEMBER_FACE_SETS);
00350 SUMA_RETURN (RetStrct);
00351 }
00352 if (RetStrct->N_Memb[inode] > RetStrct->N_Memb_max) RetStrct->N_Memb_max = RetStrct->N_Memb[inode];
00353 ++i;
00354 } while (i < FaceDim);
00355 }
00356
00357 /*allocate just enough for returning variables */
00358 RetStrct->NodeMemberOfFaceSet = (int **) SUMA_allocate2D (Nind, RetStrct->N_Memb_max ,sizeof(int));
00359 if (!RetStrct->NodeMemberOfFaceSet)
00360 {
00361 fprintf(SUMA_STDERR,"Error %s: Failed to allocate for RetStrct->NodeMemberOfFaceSet\n", FuncName);
00362 SUMA_RETURN (RetStrct);
00363 }
00364
00365 /* loop through all nodes, cp results into RetStrct->NodeMemberOfFaceSet and seal with -1 */
00366 for (inode = 0; inode < Nind; ++inode) {
00367 i = 0;
00368 while (i < RetStrct->N_Memb[inode]) {
00369 RetStrct->NodeMemberOfFaceSet[inode][i] = tmpMember[inode][i];
00370 ++i;
00371 }
00372 /*seal with -1 */
00373 if (RetStrct->N_Memb[inode] < RetStrct->N_Memb_max) RetStrct->NodeMemberOfFaceSet[inode][i] = -1;
00374 }
00375
00376 /* Clean up time */
00377 if (tmpMember) SUMA_free2D((char **)tmpMember, Nind);
00378
00379 RetStrct->Nnode = Nind;
00380 SUMA_RETURN (RetStrct);
00381
00382 }/*SUMA_MemberFaceSets*/
|
|
||||||||||||
|
Read in some parameters from a .param file Definition at line 839 of file SUMA_Surface_IO.c. References SUMA_SureFit_struct::AC, SUMA_SureFit_struct::AC_WholeVolume, SUMA_SureFit_struct::name_param, SUMA_Boolean, SUMA_ENTRY, SUMA_filexists(), SUMA_iswordin(), SUMA_RETURN, and SUMA_SL_Warn. Referenced by SUMA_Load_Surface_Object_eng().
00840 {
00841 static char FuncName[]={"SUMA_Read_SureFit_Param"};
00842 int ex, evl;
00843 FILE *sf_file;
00844 SUMA_Boolean Done;
00845 char delimstr[] = {' ', '\0'}, stmp[100], s[1000], *st;
00846
00847 SUMA_ENTRY;
00848
00849 /* check for existence */
00850 if (!SUMA_filexists(f_name)) {
00851 fprintf(SUMA_STDERR,"File %s does not exist or cannot be read.\n", f_name);
00852 SUMA_RETURN (NOPE);
00853 }
00854
00855 sprintf(SF->name_param, "%s", f_name);
00856
00857 /* start reading */
00858 sf_file = fopen (f_name,"r");
00859 if (sf_file == NULL)
00860 {
00861 fprintf (SUMA_STDERR,"Error %s: Could not open input file ",FuncName);
00862 SUMA_RETURN (NOPE);
00863 }
00864
00865 /* read until you reach something you like */
00866 ex = 1;
00867 Done = NOPE;
00868 sprintf(delimstr,"=");
00869 while (ex != EOF && !Done)
00870 {
00871 ex = fscanf (sf_file,"%s",s);
00872
00873 sprintf(stmp,"ACx_WholeVolume");
00874 evl = SUMA_iswordin (s,stmp);
00875 if (evl == 1) {
00876 /* found ACx_WholeVolume */
00877 /*fprintf(SUMA_STDOUT, "Found ACx_WholeVolume:");*/
00878 /* go past the = sign and grab the value */
00879 st = strtok(s, delimstr);
00880 st = strtok(NULL, delimstr);
00881 SF->AC_WholeVolume[0] = atof(st);
00882 /*fprintf(SUMA_STDOUT, " %f\n", SF->AC_WholeVolume[0]);*/
00883 continue;
00884 }
00885 sprintf(stmp,"ACy_WholeVolume");
00886 evl = SUMA_iswordin (s,stmp);
00887 if (evl == 1) {
00888 /* found ACy_WholeVolume */
00889 /*fprintf(SUMA_STDOUT, "Found ACy_WholeVolume:");*/
00890 /* go past the = sign and grab the value */
00891 st = strtok(s, delimstr);
00892 st = strtok(NULL, delimstr);
00893 SF->AC_WholeVolume[1] = atof(st);
00894 /*fprintf(SUMA_STDOUT, " %f\n", SF->AC_WholeVolume[1]);*/
00895 continue;
00896 }
00897 sprintf(stmp,"ACz_WholeVolume");
00898 evl = SUMA_iswordin (s,stmp);
00899 if (evl == 1) {
00900 /* found ACz_WholeVolume */
00901 /*fprintf(SUMA_STDOUT, "Found ACz_WholeVolume:");*/
00902 /* go past the = sign and grab the value */
00903 st = strtok(s, delimstr);
00904 st = strtok(NULL, delimstr);
00905 SF->AC_WholeVolume[2] = atof(st);
00906 /*fprintf(SUMA_STDOUT, " %f\n", SF->AC_WholeVolume[2]);*/
00907 continue;
00908 }
00909
00910 sprintf(stmp,"ACx");
00911 evl = SUMA_iswordin (s,stmp);
00912 if (evl == 1) {
00913 /* found ACx */
00914 /*fprintf(SUMA_STDOUT, "Found ACx:");*/
00915 /* go past the = sign and grab the value */
00916 st = strtok(s, delimstr);
00917 st = strtok(NULL, delimstr);
00918 SF->AC[0] = atof(st);
00919 /*fprintf(SUMA_STDOUT, " %f\n", SF->AC[0]);*/
00920 continue;
00921 }
00922 sprintf(stmp,"ACy");
00923 evl = SUMA_iswordin (s,stmp);
00924 if (evl == 1) {
00925 /* found ACy */
00926 /*fprintf(SUMA_STDOUT, "Found ACy:");*/
00927 /* go past the = sign and grab the value */
00928 st = strtok(s, delimstr);
00929 st = strtok(NULL, delimstr);
00930 SF->AC[1] = atof(st);
00931 /*fprintf(SUMA_STDOUT, " %f\n", SF->AC[1]);*/
00932 continue;
00933 }
00934 sprintf(stmp,"ACz");
00935 evl = SUMA_iswordin (s,stmp);
00936 if (evl == 1) {
00937 /* found ACz */
00938 /*fprintf(SUMA_STDOUT, "Found ACz:");*/
00939 /* go past the = sign and grab the value */
00940 st = strtok(s, delimstr);
00941 st = strtok(NULL, delimstr);
00942 SF->AC[2] = atof(st);
00943 /*fprintf(SUMA_STDOUT, " %f\n", SF->AC[2]);*/
00944 continue;
00945 }
00946
00947 }
00948
00949 fclose(sf_file);
00950
00951 /* Sanity Checks */
00952 if (SF->AC[0] == 0.0 && SF->AC[1] == 0.0 && SF->AC[2] == 0.0) {
00953 fprintf (SUMA_STDERR,"Error %s: All values for AC are 0.0. Check your params file.\n", FuncName);
00954 SUMA_RETURN (NOPE);
00955 }
00956
00957 if (SF->AC_WholeVolume[0] == 0.0 && SF->AC_WholeVolume[1] == 0.0 && SF->AC_WholeVolume[2] == 0.0) {
00958 fprintf (SUMA_STDERR,"Error %s: All values for AC_WholeVolume are 0.0. Check your params file.\n", FuncName);
00959 SUMA_RETURN (NOPE);
00960 }
00961
00962 if (SF->AC[0] == SF->AC_WholeVolume[0] && SF->AC[1] == SF->AC_WholeVolume[1] && SF->AC[2] == SF->AC_WholeVolume[2])
00963 {
00964 SUMA_SL_Warn("Idetincal values for AC and AC_WholeVolume.\nCheck your params file if not using Talairach-ed surfaces.\n");
00965 /* looks like that's OK for TLRC surfaces ...*/
00966 /*
00967 fprintf (SUMA_STDERR,"Error %s: Idetincal values for AC and AC_WholeVolume. Check your params file.\n", FuncName);
00968 SUMA_RETURN (NOPE);
00969 */
00970 }
00971 if (SF->AC[0] < 0 || SF->AC[1] < 0 || SF->AC[2] < 0 || SF->AC_WholeVolume[0] < 0 || SF->AC_WholeVolume[1] < 0 || SF->AC_WholeVolume[2] < 0)
00972 {
00973 fprintf (SUMA_STDERR,"Error %s: Negative values in AC or AC_WholeVolume. Check you params file.\n", FuncName);
00974 SUMA_RETURN (NOPE);
00975 }
00976
00977 SUMA_RETURN (YUP);
00978 }
|
|
||||||||||||
|
Register a DO with surface viewer RegisteredDO vector if dov_id is present in cSV, nothing is done if not found then dov_id is registered at the end of cSV->RegisteredDO When a DO is registered, a ColorList is created if the DO is a surface object. and N_DO is updated Definition at line 364 of file SUMA_DOmanip.c. References SUMA_SurfaceViewer::ColList, i, SUMA_COLORLIST_STRUCT::idcode_str, LocalHead, SUMA_SurfaceViewer::N_ColList, SUMA_SurfaceViewer::N_DO, SUMA_SurfaceViewer::RegisteredDO, SUMA_Boolean, SUMA_ENTRY, SUMA_FillColorList(), SUMA_isSO(), SUMA_MAX_SURF_VIEWERS, SUMA_RETURN, SUMA_UpdateViewerTitle(), and SUMA_WhichSV(). Referenced by SUMA_LoadSegDO(), SUMA_SetupSVforDOs(), SUMA_SwitchSO(), and SUMA_SwitchState().
00365 {
00366 int i;
00367 static char FuncName[]={"SUMA_RegisterDO"};
00368 SUMA_Boolean LocalHead = NOPE;
00369
00370 SUMA_ENTRY;
00371
00372 if (LocalHead && SUMA_WhichSV(cSV, SUMAg_SVv, SUMA_MAX_SURF_VIEWERS) != 0) {
00373 fprintf(SUMA_STDERR,"%s: Muted for viewer[%c]\n", FuncName, 65+SUMA_WhichSV(cSV, SUMAg_SVv, SUMA_MAX_SURF_VIEWERS) );
00374 /* turn off the LocalHead, too much output*/
00375 LocalHead = NOPE;
00376 }
00377
00378 /* check to see if dov_id exists */
00379 i = 0;
00380 while (i < cSV->N_DO) {
00381 if (cSV->RegisteredDO[i] == dov_id) {
00382 /* found do nothing, return */
00383 SUMA_RETURN(YUP);
00384 }
00385 ++i;
00386 }
00387 cSV->RegisteredDO[cSV->N_DO] = dov_id;
00388 cSV->N_DO += 1;
00389
00390 /* Now add the ColorList, if DO is a surface object */
00391 if (SUMA_isSO(SUMAg_DOv[dov_id])) {
00392 if (LocalHead) fprintf (SUMA_STDERR,"%s: Adding color list...\n", FuncName);
00393 /* add the ColorList */
00394 if (!SUMA_FillColorList (cSV, (SUMA_SurfaceObject *)SUMAg_DOv[dov_id].OP)) {
00395 fprintf(SUMA_STDERR,"Error %s: Failed in SUMA_FillColorList.\n", FuncName);
00396 SUMA_RETURN (NOPE);
00397 }
00398 }
00399
00400 if (LocalHead) fprintf (SUMA_STDERR, "%s: Back from SUMA_FillColorList. (%s/%d).\n", \
00401 FuncName, cSV->ColList[0].idcode_str, cSV->N_ColList);
00402
00403 if (LocalHead) {
00404 fprintf (SUMA_STDERR,"%s: RegisteredDO is now:\n", FuncName);
00405 for (i=0; i< cSV->N_DO; ++i) {
00406 fprintf(SUMA_STDERR,"RegisteredDO[%d] = %d\t", i, cSV->RegisteredDO[i]);
00407 }
00408 fprintf(SUMA_STDERR,"\n");
00409 }
00410
00411 /* update the title bar */
00412 SUMA_UpdateViewerTitle(cSV);
00413
00414 SUMA_RETURN(YUP);
00415 }
|
|
|
This function decrements the N_link field in IN by 1 and returns the resultant N_link value a -1 is returned if IN->N_link = 0 or IN == NULL ans = SUMA_ReleaseLink (IN);
Definition at line 127 of file SUMA_DOmanip.c. References LocalHead, SUMA_INODE::N_link, SUMA_Boolean, SUMA_ENTRY, and SUMA_RETURN. Referenced by SUMA_BreakInodeLink(), SUMA_Free_Surface_Object(), and SUMA_ReleaseOverlay().
00128 {
00129 static char FuncName[]={"SUMA_ReleaseLink"};
00130 SUMA_Boolean LocalHead = NOPE;
00131
00132 SUMA_ENTRY;
00133
00134 if (!IN) {
00135 /* This typically happens when A link was never created in the first place.
00136 It used to be an error message but now it is just a warning because some
00137 programs compute things like SO->Cx without creating an inode with it ...*/
00138 fprintf (SUMA_STDERR,"Warning %s: Inode is null. Returning -1.\n", FuncName);
00139 SUMA_RETURN(-1);
00140 }
00141 if (!IN->N_link) {
00142 if (LocalHead) fprintf (SUMA_STDERR,"%s: No links. Returning -1.\n", FuncName);
00143 /* You do not want to return a 0 because freeing is done when no links remain
00144 THIS STUPID SYSTEM SHOULD BE ELIMINATED IN FAVOR OF THE METHOD USED FOR OVERLAYS*/
00145 SUMA_RETURN(-1);
00146 }
00147 else {
00148 IN->N_link--;
00149 SUMA_RETURN(IN->N_link);
00150 }
00151 }
|
|
||||||||||||||||||||
|
Remove a displayable object from dov success = SUMA_RemoveDO(dov, N_dov, op, Free_op);.
Definition at line 320 of file SUMA_DOmanip.c. References SUMA_DO::CoordType, i, LocalHead, SUMA_DO::ObjectType, SUMA_DO::OP, SUMA_Boolean, SUMA_ENTRY, SUMA_Free_Displayable_Object(), SUMA_LH, SUMA_RETURN, and SUMA_SLP_Crit. Referenced by SUMA_DeleteROI().
00321 {
00322 static char FuncName[] = {"SUMA_RemoveDO"};
00323 int i;
00324 SUMA_Boolean LocalHead = NOPE, Found=NOPE;
00325
00326 SUMA_ENTRY;
00327
00328 SUMA_LH("Called");
00329
00330 for (i=0; i<*N_dov; ++i) {
00331 if (dov[i].OP == op) {
00332 Found = YUP;
00333 if (LocalHead) fprintf (SUMA_STDERR,"%s: found object. Removing it from dov.\n", FuncName);
00334 if (Free_op) {
00335 if (LocalHead) fprintf (SUMA_STDERR,"%s: Freeing object.\n", FuncName);
00336 if (!SUMA_Free_Displayable_Object (&dov[i])) {
00337 SUMA_SLP_Crit("Failed to free displayable object.");
00338 SUMA_RETURN(NOPE);
00339 }
00340 }
00341 *N_dov = *N_dov-1;
00342 dov[i].OP = dov[*N_dov].OP;
00343 dov[i].ObjectType = dov[*N_dov].ObjectType;
00344 dov[i].CoordType = dov[*N_dov].CoordType;
00345 }
00346 }
00347
00348
00349 if (Found) {
00350 SUMA_RETURN(YUP);
00351 } else {
00352 SUMA_RETURN(NOPE);
00353 }
00354 }
|
|
||||||||||||||||
|
print out the data contained in dov Definition at line 482 of file SUMA_DOmanip.c. References AO_type, SUMA_FileName::FileName, SUMA_SurfaceObject::FileType, GO_type, i, SUMA_ROI::idcode_str, SUMA_DRAWN_ROI::idcode_str, SUMA_SegmentDO::idcode_str, SUMA_Axis::idcode_str, SUMA_ROI::Label, SUMA_DRAWN_ROI::Label, SUMA_SegmentDO::Label, LS_type, SUMA_Axis::Name, SUMA_SurfaceObject::Name, SUMA_SurfaceObject::Name_coord, SUMA_SurfaceObject::Name_topo, SUMA_FileName::Path, ROIdO_type, ROIO_type, SO_type, SUMA_ENTRY, SUMA_RETURNe, and SUMA_SUREFIT. Referenced by SUMA_input().
00483 {
00484 int i;
00485 SUMA_SurfaceObject *so_op;
00486 static char FuncName[]={"SUMA_Show_DOv"};
00487
00488 SUMA_ENTRY;
00489
00490 if (Out == NULL) Out = stdout;
00491 fprintf(Out,"\nDOv contents (%d elements):\n", N_dov);
00492 for (i=0; i < N_dov; ++i) {
00493 switch (dov[i].ObjectType) {
00494 case SO_type:
00495 so_op = (SUMA_SurfaceObject *)dov[i].OP;
00496 if (so_op->FileType != SUMA_SUREFIT) {
00497 fprintf(Out,"DOv ID: %d\n\tName: %s/%s\n\tType: %d, Axis Attachment %d\n",\
00498 i, so_op->Name.Path, so_op->Name.FileName,\
00499 dov[i].ObjectType, dov[i].CoordType);
00500 } else {
00501 fprintf(Out,"DOv ID: %d\n\tNameCoord: %s/%s\n\tNameTopo: %s/%s\n\tType: %d, Axis Attachment %d\n",\
00502 i, so_op->Name_coord.Path, so_op->Name_coord.FileName,\
00503 so_op->Name_topo.Path, so_op->Name_topo.FileName,\
00504 dov[i].ObjectType, dov[i].CoordType);
00505 }
00506 break;
00507 case AO_type:
00508 {
00509 SUMA_Axis* ao;
00510 ao = (SUMA_Axis*) dov[i].OP;
00511 fprintf(Out,"DOv ID: %d\n\tAxis Object\n\tType: %d, Axis Attachment %d\n", i,dov[i].ObjectType, dov[i].CoordType);
00512 fprintf(Out,"\tName: %s\tidcode: %s\n", ao->Name, ao->idcode_str);
00513 }
00514 break;
00515 case LS_type:
00516 {
00517 SUMA_SegmentDO *sdo=NULL;
00518
00519 sdo = (SUMA_SegmentDO *)dov[i].OP;
00520 fprintf(Out,"DOv ID: %d\n\tLine Segment Object\n\tType: %d, Axis Attachment %d\n", i,dov[i].ObjectType, dov[i].CoordType);
00521 fprintf(Out,"\tLabel: %s\tidcode: %s\n", sdo->Label, sdo->idcode_str);
00522
00523 }
00524 break;
00525 case ROIdO_type:
00526 {
00527 SUMA_DRAWN_ROI *dROI = NULL;
00528
00529 dROI = (SUMA_DRAWN_ROI *)dov[i].OP;
00530 fprintf(Out,"DOv ID: %d\n\tLine Segment Object\n\tType: %d, Axis Attachment %d\n", i,dov[i].ObjectType, dov[i].CoordType);
00531 fprintf(Out,"\tLabel: %s\tidcode: %s\n", dROI->Label, dROI->idcode_str);
00532 }
00533 break;
00534 case ROIO_type:
00535 {
00536 SUMA_ROI *ROI = NULL;
00537
00538 ROI = (SUMA_ROI *)dov[i].OP;
00539 fprintf(Out,"DOv ID: %d\n\tLine Segment Object\n\tType: %d, Axis Attachment %d\n", i,dov[i].ObjectType, dov[i].CoordType);
00540 fprintf(Out,"\tLabel: %s\tidcode: %s\n", ROI->Label, ROI->idcode_str);
00541 }
00542 break;
00543 case GO_type:
00544 fprintf(Out,"DOv ID: %d\n\tGrid Object\n", i);
00545 break;
00546 default:
00547 fprintf(Out,"DOv ID: %d\n\tUnknown Type!\n", i);
00548 break;
00549 }
00550 }
00551 SUMA_RETURNe;
00552 }
|
|
||||||||||||
|
Show the contents of SUMA_VOLPAR structure
Definition at line 762 of file SUMA_VolData.c. References SUMA_ENTRY, SUMA_free, SUMA_RETURNe, and SUMA_VolPar_Info().
00763 {
00764 static char FuncName[]={"SUMA_Show_VolPar"};
00765 char *s;
00766
00767 SUMA_ENTRY;
00768
00769 if (Out == NULL) Out = SUMA_STDOUT;
00770
00771 s = SUMA_VolPar_Info(VP);
00772
00773 if (s) {
00774 fprintf (Out, "%s", s);
00775 SUMA_free(s);
00776 }else {
00777 fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_VolPar_Info.\n", FuncName);
00778 }
00779
00780 SUMA_RETURNe;
00781
00782 }
|
|
||||||||||||||||||||
|
** File : SUMA_SurfNorm.c
Usage : RetStrct = SUMA_SurfNorm (NodeList, N_NodeList, FaceSetList, N_FaceSetList ); Input paramters :
------------------- ## * Here, Node I will have its normal biased towards the direction of N2 and N3 ## * | because node I is part of two triangles from one side and one triangle in ## N1 * | each of the other 2 sides. ## * | ## I * N3 | ------------------ * | |## |######| | ## N4 | * | ## | N2 * | ## | * | ## | * | ## | * ------------------ Definition at line 87 of file SUMA_SurfNorm.c. References SUMA_SURF_NORM::FaceNormList, i, LocalHead, SUMA_SURF_NORM::N_Face, SUMA_SURF_NORM::N_Node, SUMA_SURF_NORM::NodeNormList, SUMA_alloc_problem(), SUMA_Boolean, SUMA_calloc, SUMA_ENTRY, SUMA_error_message(), SUMA_free, SUMA_LH, SUMA_RETURN, SUMA_SL_Warn, and SUMA_TriNorm(). Referenced by main(), SUMA_Cmap_To_SO(), SUMA_Cmap_To_SO_old(), SUMA_CreateIcosahedron(), SUMA_Pattie_Volume(), and SUMA_PrepSO_GeomProp_GL().
00088 {/*SUMA_SurfNorm*/
00089 static char stmp[200], FuncName[]={"SUMA_SurfNorm"};
00090 float d1[3], d2[3], d, nrm;
00091 SUMA_SURF_NORM RetStrct;
00092 int *Index, *N_Memb, i, j, maxind, NotMember, id, id2, ND, ip, NP;
00093 SUMA_Boolean LocalHead = NOPE;
00094
00095 SUMA_ENTRY;
00096
00097 ND = 3;
00098 NP = 3;
00099 RetStrct.N_Node = N_NodeList; /* redundant, but practical for clean up outside the function */
00100 RetStrct.N_Face = N_FaceSetList;
00101
00102 /* allocate space */
00103 if (LocalHead) fprintf(SUMA_STDERR,"%s: %d %d\n", FuncName, N_NodeList, N_FaceSetList);
00104 RetStrct.FaceNormList = (float *)SUMA_calloc (N_FaceSetList * NP, sizeof(float));
00105 RetStrct.NodeNormList = (float *)SUMA_calloc (N_NodeList * ND, sizeof(float));
00106 Index = (int *)SUMA_calloc (N_NodeList, sizeof(int));
00107 N_Memb = (int *)SUMA_calloc (N_NodeList, sizeof(int));
00108 if (!RetStrct.FaceNormList || !RetStrct.NodeNormList || !Index || !N_Memb)
00109 {
00110 SUMA_alloc_problem (FuncName);
00111 SUMA_RETURN (RetStrct);
00112 }
00113
00114 /* calculate and normalize triangle normals */
00115 maxind = N_NodeList -1;
00116 for (i=0; i < N_FaceSetList; i++) {
00117 ip = NP * i;
00118 for (j=0; j < 3; j++) {
00119 d1[j] = NodeList[(ND*FaceSetList[ip])+j] - NodeList[(ND*FaceSetList[ip+1])+j];
00120 d2[j] = NodeList[(ND*FaceSetList[ip+1])+j] - NodeList[(ND*FaceSetList[ip+2])+j];
00121 }
00122 RetStrct.FaceNormList[ip] = d1[1]*d2[2] - d1[2]*d2[1];
00123 RetStrct.FaceNormList[ip+1] = d1[2]*d2[0] - d1[0]*d2[2];
00124 RetStrct.FaceNormList[ip+2] = d1[0]*d2[1] - d1[1]*d2[0];
00125 d = sqrt(RetStrct.FaceNormList[ip]*RetStrct.FaceNormList[ip]+RetStrct.FaceNormList[ip+1]*RetStrct.FaceNormList[ip+1]+RetStrct.FaceNormList[ip+2]*RetStrct.FaceNormList[ip+2]);
00126 if (d == 0.0) {
00127 /* I used to return here with a nasty message, but it seems that FreeSurfer surfaces contain such conditions
00128 So, now I just set the normal to 1.0 in that case */
00129 /*SUMA_error_message (FuncName,"Zero length vector, returning",1);
00130 if (RetStrct.FaceNormList) SUMA_free(RetStrct.FaceNormList);
00131 if (RetStrct.NodeNormList) SUMA_free(RetStrct.NodeNormList);
00132 if (Index) SUMA_free(Index);
00133 if (N_Memb) SUMA_free(N_Memb);
00134 SUMA_RETURN (RetStrct);*/
00135 RetStrct.FaceNormList[ip] = 1.0;
00136 RetStrct.FaceNormList[ip+1] = 1.0;
00137 RetStrct.FaceNormList[ip+2] = 1.0;
00138
00139 } else {
00140 RetStrct.FaceNormList[ip] /= d;
00141 RetStrct.FaceNormList[ip+1] /= d;
00142 RetStrct.FaceNormList[ip+2] /= d;
00143 }
00144
00145 #if 0
00146 /* a test for the function SUMA_TriNorm */
00147 {
00148 float test_norm[3];
00149 SUMA_TriNorm (&(NodeList[(ND*FaceSetList[ip])]), &(NodeList[(ND*FaceSetList[ip+1])]), &(NodeList[(ND*FaceSetList[ip+2])]), test_norm);
00150 if (test_norm[0] != RetStrct.FaceNormList[ip] || test_norm[1] != RetStrct.FaceNormList[ip+1] || test_norm[2] != RetStrct.FaceNormList[ip+2]) {
00151 fprintf (SUMA_STDERR, "Error %s: Test of SUMA_TriNorm failed, difference in norms. Exiting.\n", FuncName);
00152 exit(1);
00153 }
00154 fprintf (SUMA_STDERR,".");
00155 }
00156
00157 #endif
00158
00159 /*each node making up the FaceSet will get its normal vector updated*/
00160 if (FaceSetList[ip] > maxind || FaceSetList[ip+1] > maxind || FaceSetList[ip+2] > maxind) {
00161 SUMA_error_message (FuncName,"FaceSetList contains indices >= N_NodeList",1);
00162 if (RetStrct.FaceNormList) SUMA_free(RetStrct.FaceNormList);
00163 if (RetStrct.NodeNormList) SUMA_free(RetStrct.NodeNormList);
00164 if (Index) SUMA_free(Index);
00165 if (N_Memb) SUMA_free(N_Memb);
00166 SUMA_RETURN (RetStrct);
00167 }
00168
00169
00170 id2 = ND * FaceSetList[ip];
00171 RetStrct.NodeNormList[id2] += RetStrct.FaceNormList[ip];
00172 RetStrct.NodeNormList[id2+1] += RetStrct.FaceNormList[ip+1];
00173 RetStrct.NodeNormList[id2+2] += RetStrct.FaceNormList[ip+2];
00174 ++N_Memb[FaceSetList[ip]];
00175 id2 = ND * FaceSetList[ip+1];
00176 RetStrct.NodeNormList[id2] += RetStrct.FaceNormList[ip];
00177 RetStrct.NodeNormList[id2+1] += RetStrct.FaceNormList[ip+1];
00178 RetStrct.NodeNormList[id2+2] += RetStrct.FaceNormList[ip+2];
00179 ++N_Memb[FaceSetList[ip+1]];
00180 id2 = ND * FaceSetList[ip+2];
00181 RetStrct.NodeNormList[id2] += RetStrct.FaceNormList[ip];
00182 RetStrct.NodeNormList[id2+1] += RetStrct.FaceNormList[ip+1];
00183 RetStrct.NodeNormList[id2+2] += RetStrct.FaceNormList[ip+2];
00184 ++N_Memb[FaceSetList[ip+2]];
00185 }
00186 SUMA_LH("Normalizing");
00187 /*Now normalize NodeNormList*/
00188 NotMember = 0;
00189 for (i=0; i<N_NodeList; ++i)
00190 {
00191 id = ND * i;
00192 if (N_Memb[i])
00193 {
00194 /* fprintf(SUMA_STDERR,"%s: Node %d, Normal (pre scale) %f %f %f\n", FuncName, i, RetStrct.NodeNormList[id], RetStrct.NodeNormList[id+1], RetStrct.NodeNormList[id+2]); */
00195 RetStrct.NodeNormList[id] /= N_Memb[i];
00196 RetStrct.NodeNormList[id+1] /= N_Memb[i];
00197 RetStrct.NodeNormList[id+2] /= N_Memb[i];
00198 /* normalize */
00199 nrm = sqrt(RetStrct.NodeNormList[id]*RetStrct.NodeNormList[id] + RetStrct.NodeNormList[id+1]*RetStrct.NodeNormList[id+1] + RetStrct.NodeNormList[id+2]*RetStrct.NodeNormList[id+2]);
00200 if (nrm) { /* at times nrm is 0. This happened once on a flat surface that was not consistently wound. Nodes that were
00201 members of two triangles of opposed normals ended up with a normal (and nrm) of 0 */
00202 RetStrct.NodeNormList[id] /= nrm;
00203 RetStrct.NodeNormList[id+1] /= nrm;
00204 RetStrct.NodeNormList[id+2] /= nrm;
00205 }
00206
00207 /* fprintf(SUMA_STDERR,"%s: Node %d, N_Memb[i] = %d, nrm = %f\n", FuncName, i, N_Memb[i], nrm); */
00208 }
00209 else
00210 {
00211 ++NotMember;
00212 /*
00213 For some patches (Free Surfer's) such conditions are frequent, spitting out that message becomes old too quick */
00214 /*
00215 fprintf(stdout,"\n%s Warning: Node %d is not a member of any FaceSets, returning unit vector as normal.\n", FuncName, i);
00216 */
00217 RetStrct.NodeNormList[id] = RetStrct.NodeNormList[id+1] = RetStrct.NodeNormList[id+2] = 1.0;
00218 }
00219 }
00220 if (NotMember) {
00221 sprintf (stmp, "(IGNORE for surface patches\n"
00222 "%d nodes (%f%% of total) are\n"
00223 "not members of any FaceSets.\n"
00224 "Their normals are set to the\n"
00225 "unit vector.\n", NotMember, (float)NotMember/(float)N_NodeList*100.0);
00226 SUMA_SL_Warn(stmp);
00227 }
00228
00229 if (N_Memb) SUMA_free(N_Memb);
00230 if (Index) SUMA_free(Index);
00231 SUMA_RETURN (RetStrct);
00232 }/*SUMA_SurfNorm*/
|
|
|
a copy of THD_handedness from ../thd_rotangles.c Dunno why the original was giving me pain linking ... Definition at line 8 of file SUMA_VolData.c. References THD_3dim_dataset::daxes, ISVALID_DSET, LOAD_ZERO_MAT, THD_mat33::mat, MAT_DET, q, SUMA_RETURN, THD_dataxes::xxorient, THD_dataxes::yyorient, and THD_dataxes::zzorient. Referenced by SUMA_VolParFromDset().
00009 {
00010 THD_dataxes * dax ;
00011 THD_mat33 q ;
00012 int col ;
00013 float val ;
00014
00015
00016 if( !ISVALID_DSET(dset) ) SUMA_RETURN(1) ;
00017
00018 LOAD_ZERO_MAT(q) ;
00019 dax = dset->daxes ;
00020
00021 col = 0 ;
00022 switch( dax->xxorient ){
00023 case 0: q.mat[0][col] = 1.0 ; break ;
00024 case 1: q.mat[0][col] = -1.0 ; break ;
00025 case 2: q.mat[1][col] = -1.0 ; break ;
00026 case 3: q.mat[1][col] = 1.0 ; break ;
00027 case 4: q.mat[2][col] = 1.0 ; break ;
00028 case 5: q.mat[2][col] = -1.0 ; break ;
00029 }
00030
00031 col = 1 ;
00032 switch( dax->yyorient ){
00033 case 0: q.mat[0][col] = 1.0 ; break ;
00034 case 1: q.mat[0][col] = -1.0 ; break ;
00035 case 2: q.mat[1][col] = -1.0 ; break ;
00036 case 3: q.mat[1][col] = 1.0 ; break ;
00037 case 4: q.mat[2][col] = 1.0 ; break ;
00038 case 5: q.mat[2][col] = -1.0 ; break ;
00039 }
00040
00041 col = 2 ;
00042 switch( dax->zzorient ){
00043 case 0: q.mat[0][col] = 1.0 ; break ;
00044 case 1: q.mat[0][col] = -1.0 ; break ;
00045 case 2: q.mat[1][col] = -1.0 ; break ;
00046 case 3: q.mat[1][col] = 1.0 ; break ;
00047 case 4: q.mat[2][col] = 1.0 ; break ;
00048 case 5: q.mat[2][col] = -1.0 ; break ;
00049 }
00050
00051 val = MAT_DET(q) ;
00052 if( val > 0.0 ) SUMA_RETURN( 1) ; /* right handed */
00053 else SUMA_RETURN(-1) ; /* left handed */
00054 }
|
|
||||||||||||
|
remove DO with I.D. dov_id from RegisteredDO list of that current viewer removal of dov_id element is done by replacing it with the last entry in RegisteredDO list. If not found, nothing happens. Definition at line 421 of file SUMA_DOmanip.c. References i, SUMA_SurfaceObject::idcode_str, LocalHead, SUMA_SurfaceViewer::N_DO, SUMA_DO::OP, SUMA_SurfaceViewer::RegisteredDO, SUMA_Boolean, SUMA_EmptyColorList(), SUMA_ENTRY, SUMA_isSO(), SUMA_RETURN, and SUMA_UpdateViewerTitle(). Referenced by SUMA_SwitchSO(), and SUMA_SwitchState().
00422 {
00423 int i;
00424 static char FuncName[]={"SUMA_UnRegisterDO"};
00425 SUMA_Boolean LocalHead = NOPE;
00426
00427 SUMA_ENTRY;
00428
00429 /* check to see if dov_id exists */
00430 i = 0;
00431 while (i < cSV->N_DO) {
00432 if (cSV->RegisteredDO[i] == dov_id) {
00433 /* found, replace it by the last in the list */
00434 cSV->RegisteredDO[i] = cSV->RegisteredDO[cSV->N_DO-1];
00435 /*remove the last element of the list */
00436 cSV->RegisteredDO[cSV->N_DO-1] = 0;
00437 cSV->N_DO -= 1;
00438
00439 /* empty the ColorList for this surface */
00440 if (SUMA_isSO(SUMAg_DOv[dov_id])) {
00441 SUMA_SurfaceObject *SO = NULL;
00442 if (LocalHead) fprintf (SUMA_STDERR,"%s: Emptying ColorList ...\n", FuncName);
00443 SO = (SUMA_SurfaceObject *)SUMAg_DOv[dov_id].OP;
00444 if (!SUMA_EmptyColorList (cSV, SO->idcode_str)) {
00445 fprintf (SUMA_STDERR,"Error %s: Failed in SUMA_EmptyColorList\n", FuncName);
00446 SUMA_RETURN(NOPE);
00447 }
00448 }
00449
00450 if (LocalHead) {
00451 fprintf (SUMA_STDERR,"%s: RegisteredDO is now:\n", FuncName);
00452 for (i=0; i< cSV->N_DO; ++i) {
00453 fprintf(SUMA_STDERR,"RegisteredDO[%d] = %d\t", i, cSV->RegisteredDO[i]);
00454 }
00455 fprintf(SUMA_STDERR,"\n");
00456 }
00457
00458 /* update the title bar */
00459 SUMA_UpdateViewerTitle(cSV);
00460
00461
00462 SUMA_RETURN(YUP);
00463 }
00464 ++i;
00465 }
00466 /* Not found, nothing happens */
00467
00468 if (LocalHead) {
00469 fprintf (SUMA_STDERR,"%s: RegisteredDO is now:\n", FuncName);
00470 for (i=0; i< cSV->N_DO; ++i) {
00471 fprintf(SUMA_STDERR,"RegisteredDO[%d] = %d\t", i, cSV->RegisteredDO[i]);
00472 }
00473 fprintf(SUMA_STDERR,"\n");
00474 }
00475
00476 SUMA_RETURN(YUP);
00477 }
|
|
|
Definition at line 584 of file SUMA_VolData.c. References LocalHead, SUMA_Boolean, SUMA_ENTRY, SUMA_RETURN, SUMA_SL_Err, SUMA_VolParFromDset(), THD_delete_3dim_dataset(), and THD_open_dataset(). Referenced by main(), SUMA_Load_Surface_Object_eng(), and SUMA_process_NIML_data().
00585 {
00586 ATR_float *atr;
00587 static char FuncName[]={"SUMA_VolPar_Attr"};
00588 SUMA_VOLPAR *VP;
00589 THD_3dim_dataset *dset;
00590 int ii;
00591 MCW_idcode idcode;
00592 SUMA_Boolean LocalHead = NOPE;
00593
00594 SUMA_ENTRY;
00595
00596 /* read the header of the parent volume */
00597 dset = THD_open_dataset(volparent_name);
00598 if (dset == NULL) {
00599 fprintf (SUMA_STDERR,"Error %s: Could not read %s\n", FuncName, volparent_name);
00600 SUMA_RETURN (NULL);
00601 }
00602
00603 VP = SUMA_VolParFromDset(dset);
00604 if (!VP) {
00605 SUMA_SL_Err("Failed in SUMA_VolParFromDset");
00606 }
00607
00608 /* now free the dset pointer */
00609 THD_delete_3dim_dataset( dset , False ) ;
00610
00611 SUMA_RETURN (VP);
00612 }
|
|
|
Form a string containing the info of the volume parent.
Definition at line 624 of file SUMA_VolData.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_VOLPAR::isanat, 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_STRING::s, SUMA_ENTRY, SUMA_free, SUMA_RETURN, SUMA_StringAppend(), SUMA_StringAppend_va(), 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_Show_VolPar(), and SUMA_SurfaceObject_Info().
00625 {
00626 static char FuncName[]={"SUMA_VolPar_Info"};
00627 char stmp[1000], *s=NULL;
00628 SUMA_STRING *SS = NULL;
00629
00630 SUMA_ENTRY;
00631
00632 SS = SUMA_StringAppend (NULL, NULL);
00633
00634 if (VP) {
00635 sprintf (stmp,"\nVP contents:\n");
00636 SS = SUMA_StringAppend (SS, stmp);
00637 sprintf (stmp,"prefix: %s\tfilecode: %s\tdirname: %s\nId code str:%s\tID code date: %s\n", \
00638 VP->prefix, VP->filecode, VP->dirname, VP->vol_idcode_str, VP->vol_idcode_date);
00639 SS = SUMA_StringAppend (SS, stmp);
00640 if (VP->idcode_str) SS = SUMA_StringAppend (SS, "IDcode is NULL\n");
00641 else SS = SUMA_StringAppend_va (SS, "IDcode: %s\n", VP->idcode_str);
00642
00643 sprintf (stmp,"isanat: %d\n", VP->isanat);
00644 SS = SUMA_StringAppend (SS, stmp);
00645 sprintf (stmp,"Orientation: %d %d %d\n", \
00646 VP->xxorient, VP->yyorient, VP->zzorient);
00647 if (VP->Hand == 1) SS = SUMA_StringAppend (SS, "Right Hand Coordinate System.\n");
00648 else if (VP->Hand == -1) SS = SUMA_StringAppend (SS, "Left Hand Coordinate System.\n");
00649 else SS = SUMA_StringAppend (SS, "No hand coordinate system!\n");
00650
00651 SS = SUMA_StringAppend (SS, stmp);
00652 sprintf (stmp,"Origin: %f %f %f\n", \
00653 VP->xorg, VP->yorg, VP->zorg);
00654 SS = SUMA_StringAppend (SS, stmp);
00655 sprintf (stmp,"Delta: %f %f %f\n", \
00656 VP->dx, VP->dy, VP->dz);
00657 SS = SUMA_StringAppend (SS, stmp);
00658 sprintf (stmp,"N: %d %d %d\n",\
00659 VP->nx, VP->ny, VP->nz);
00660 SS = SUMA_StringAppend (SS, stmp);
00661
00662 if (VP->ROTATE_MATVEC != NULL) {
00663 sprintf (stmp,"VP->ROTATE_MATVEC = \n\tMrot\tDelta\n");
00664 SS = SUMA_StringAppend (SS, stmp);
00665 sprintf (stmp,"|%f\t%f\t%f|\t|%f|\n", \
00666 VP->ROTATE_MATVEC[0], VP->ROTATE_MATVEC[1], VP->ROTATE_MATVEC[2], VP->ROTATE_MATVEC[3]);
00667 SS = SUMA_StringAppend (SS, stmp);
00668 sprintf (stmp,"|%f\t%f\t%f|\t|%f|\n", \
00669 VP->ROTATE_MATVEC[4], VP->ROTATE_MATVEC[5], VP->ROTATE_MATVEC[6], VP->ROTATE_MATVEC[7]);
00670 SS = SUMA_StringAppend (SS, stmp);
00671 sprintf (stmp,"|%f\t%f\t%f|\t|%f|\n", \
00672 VP->ROTATE_MATVEC[8], VP->ROTATE_MATVEC[9], VP->ROTATE_MATVEC[10], VP->ROTATE_MATVEC[11]);
00673 SS = SUMA_StringAppend (SS, stmp);
00674 } else {
00675 sprintf (stmp,"VP->ROTATE_MATVEC = NULL\n");
00676 SS = SUMA_StringAppend (SS, stmp);
00677 }
00678 if (VP->ROTATE_CENTER_OLD != NULL) {
00679 sprintf (stmp,"VP->ROTATE_CENTER_OLD = %f, %f, %f\n", \
00680 VP->ROTATE_CENTER_OLD[0], VP->ROTATE_CENTER_OLD[1], VP->ROTATE_CENTER_OLD[2]);
00681 SS = SUMA_StringAppend (SS, stmp);
00682 }else {
00683 sprintf (stmp,"VP->ROTATE_CENTER_OLD = NULL\n");
00684 SS = SUMA_StringAppend (SS, stmp);
00685 }
00686 if (VP->ROTATE_CENTER_BASE != NULL) {
00687 sprintf (stmp,"VP->ROTATE_CENTER_BASE = %f, %f, %f\n", \
00688 VP->ROTATE_CENTER_BASE[0], VP->ROTATE_CENTER_BASE[1], VP->ROTATE_CENTER_BASE[2]);
00689 SS = SUMA_StringAppend (SS, stmp);
00690 } else {
00691 sprintf (stmp,"VP->ROTATE_CENTER_BASE = NULL\n");
00692 SS = SUMA_StringAppend (SS, stmp);
00693 }
00694 if (VP->TAGALIGN_MATVEC != NULL) {
00695 sprintf (stmp,"VP->TAGALIGN_MATVEC = \n\tMrot\tDelta\n");
00696 SS = SUMA_StringAppend (SS, stmp);
00697 sprintf (stmp,"|%f\t%f\t%f|\t|%f|\n", \
00698 VP->TAGALIGN_MATVEC[0], VP->TAGALIGN_MATVEC[1], VP->TAGALIGN_MATVEC[2], VP->TAGALIGN_MATVEC[3]);
00699 SS = SUMA_StringAppend (SS, stmp);
00700 sprintf (stmp,"|%f\t%f\t%f|\t|%f|\n", \
00701 VP->TAGALIGN_MATVEC[4], VP->TAGALIGN_MATVEC[5], VP->TAGALIGN_MATVEC[6], VP->TAGALIGN_MATVEC[7]);
00702 SS = SUMA_StringAppend (SS, stmp);
00703 sprintf (stmp,"|%f\t%f\t%f|\t|%f|\n", \
00704 VP->TAGALIGN_MATVEC[8], VP->TAGALIGN_MATVEC[9], VP->TAGALIGN_MATVEC[10], VP->TAGALIGN_MATVEC[11]);
00705 SS = SUMA_StringAppend (SS, stmp);
00706 } else {
00707 sprintf (stmp,"VP->TAGALIGN_MATVEC = NULL\n");
00708 SS = SUMA_StringAppend (SS, stmp);
00709 }
00710
00711 if (VP->VOLREG_MATVEC != NULL) {
00712 sprintf (stmp,"VP->VOLREG_MATVEC = \n\tMrot\tDelta\n");
00713 SS = SUMA_StringAppend (SS, stmp);
00714 sprintf (stmp,"|%f\t%f\t%f|\t|%f|\n", \
00715 VP->VOLREG_MATVEC[0], VP->VOLREG_MATVEC[1], VP->VOLREG_MATVEC[2], VP->VOLREG_MATVEC[3]);
00716 SS = SUMA_StringAppend (SS, stmp);
00717 sprintf (stmp,"|%f\t%f\t%f|\t|%f|\n", \
00718 VP->VOLREG_MATVEC[4], VP->VOLREG_MATVEC[5], VP->VOLREG_MATVEC[6], VP->VOLREG_MATVEC[7]);
00719 SS = SUMA_StringAppend (SS, stmp);
00720 sprintf (stmp,"|%f\t%f\t%f|\t|%f|\n", \
00721 VP->VOLREG_MATVEC[8], VP->VOLREG_MATVEC[9], VP->VOLREG_MATVEC[10], VP->VOLREG_MATVEC[11]);
00722 SS = SUMA_StringAppend (SS, stmp);
00723 } else {
00724 sprintf (stmp,"VP->VOLREG_MATVEC = NULL\n");
00725 SS = SUMA_StringAppend (SS, stmp);
00726 }
00727
00728 if (VP->VOLREG_CENTER_OLD != NULL) {
00729 sprintf (stmp,"VP->VOLREG_CENTER_OLD = %f, %f, %f\n", \
00730 VP->VOLREG_CENTER_OLD[0], VP->VOLREG_CENTER_OLD[1], VP->VOLREG_CENTER_OLD[2]);
00731 SS = SUMA_StringAppend (SS, stmp);
00732 }else {
00733 sprintf (stmp,"VP->VOLREG_CENTER_OLD = NULL\n");
00734 SS = SUMA_StringAppend (SS, stmp);
00735 }
00736
00737 if (VP->VOLREG_CENTER_BASE != NULL) {
00738 sprintf (stmp,"VP->VOLREG_CENTER_BASE = %f, %f, %f\n", \
00739 VP->VOLREG_CENTER_BASE[0], VP->VOLREG_CENTER_BASE[1], VP->VOLREG_CENTER_BASE[2]);
00740 SS = SUMA_StringAppend (SS, stmp);
00741 } else {
00742 sprintf (stmp,"VP->VOLREG_CENTER_BASE = NULL\n");
00743 SS = SUMA_StringAppend (SS, stmp);
00744 }
00745 }else{
00746 sprintf (stmp, "NULL Volume Parent Pointer.\n");
00747 SS = SUMA_StringAppend (SS, stmp);
00748 }
00749
00750 /* clean SS */
00751 SS = SUMA_StringAppend (SS, NULL);
00752 /* copy s pointer and free SS */
00753 s = SS->s;
00754 SUMA_free(SS);
00755
00756 SUMA_RETURN (s);
00757 }
|
|
|
Definition at line 399 of file SUMA_VolData.c. References MCW_idcode::date, THD_3dim_dataset::daxes, THD_3dim_dataset::dblk, SUMA_VOLPAR::dirname, DSET_DIRNAME, DSET_DX, DSET_DY, DSET_DZ, DSET_FILECODE, DSET_NX, DSET_NY, DSET_NZ, DSET_PREFIX, DSET_XORG, DSET_YORG, DSET_ZORG, SUMA_VOLPAR::dx, SUMA_VOLPAR::dy, SUMA_VOLPAR::dz, SUMA_VOLPAR::filecode, ATR_float::fl, SUMA_VOLPAR::Hand, THD_3dim_dataset::idcode, SUMA_VOLPAR::isanat, ISANAT, LocalHead, ATR_float::nfl, 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, MCW_idcode::str, SUMA_Alloc_VolPar(), SUMA_Boolean, SUMA_calloc, SUMA_ENTRY, SUMA_Free_VolPar(), SUMA_malloc, SUMA_RETURN, SUMA_THD_handedness(), SUMA_VOLPAR::TAGALIGN_MATVEC, THD_find_float_atr(), 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, THD_dataxes::xxorient, SUMA_VOLPAR::yorg, SUMA_VOLPAR::yyorient, THD_dataxes::yyorient, SUMA_VOLPAR::zorg, SUMA_VOLPAR::zzorient, and THD_dataxes::zzorient. Referenced by SUMA_VolPar_Attr().
00400 {
00401 ATR_float *atr;
00402 static char FuncName[]={"SUMA_VolParFromDset"};
00403 SUMA_VOLPAR *VP;
00404 int ii;
00405 MCW_idcode idcode;
00406 SUMA_Boolean LocalHead = NOPE;
00407
00408 SUMA_ENTRY;
00409
00410 /* read the header of the parent volume */
00411 if (dset == NULL) {
00412 fprintf (SUMA_STDERR,"Error %s:\nNULL dset\n", FuncName);
00413 SUMA_RETURN (NULL);
00414 }
00415
00416 /* allocate for VP */
00417 VP = SUMA_Alloc_VolPar();
00418 if (VP == NULL) {
00419 fprintf(SUMA_STDERR,"Error %s: Failed in SUMA_Alloc_VolPar\n", FuncName);
00420 SUMA_RETURN (NULL);
00421 }
00422
00423 /* retain pertinent info */
00424 VP->isanat = ISANAT(dset);
00425 VP->nx = DSET_NX(dset);
00426 VP->ny = DSET_NY(dset);
00427 VP->nz = DSET_NZ(dset);
00428 VP->dx = DSET_DX(dset);
00429 VP->dy = DSET_DY(dset);
00430 VP->dz = DSET_DZ(dset);
00431 VP->xorg = DSET_XORG(dset);
00432 VP->yorg = DSET_YORG(dset);
00433 VP->zorg = DSET_ZORG(dset);
00434 ii = strlen(DSET_PREFIX(dset));
00435 VP->prefix = (char *)SUMA_malloc(ii+1);
00436 ii = strlen(DSET_FILECODE(dset));
00437 VP->filecode = (char *)SUMA_malloc(ii+1);
00438 ii = strlen(DSET_DIRNAME(dset));
00439 VP->dirname = (char *)SUMA_malloc(ii+1);
00440 ii = strlen(dset->idcode.str);
00441 VP->vol_idcode_str = (char *)SUMA_malloc(ii+1);
00442 ii = strlen(dset->idcode.date);
00443 VP->vol_idcode_date = (char *)SUMA_malloc(ii+1);
00444 if (VP->prefix == NULL || VP->filecode == NULL || VP->vol_idcode_date == NULL || VP->dirname == NULL || VP->vol_idcode_str == NULL) {
00445 fprintf(SUMA_STDERR,"Error %s: Failed to allocate for strings. Kill me, please.\n", FuncName);
00446 SUMA_Free_VolPar(VP);
00447 SUMA_RETURN (NULL);
00448 }
00449 VP->prefix = strcpy(VP->prefix, DSET_PREFIX(dset));
00450 VP->filecode = strcpy(VP->filecode, DSET_FILECODE(dset));
00451 VP->dirname = strcpy(VP->dirname, DSET_DIRNAME(dset));
00452 VP->vol_idcode_str = strcpy(VP->vol_idcode_str, dset->idcode.str);
00453 VP->vol_idcode_date = strcpy(VP->vol_idcode_date, dset->idcode.date);
00454 VP->xxorient = dset->daxes->xxorient;
00455 VP->yyorient = dset->daxes->yyorient;
00456 VP->zzorient = dset->daxes->zzorient;
00457
00458 if (LocalHead) {
00459 fprintf (SUMA_STDERR,"%s: dset->idcode_str = %s\n", FuncName, dset->idcode.str);
00460 fprintf (SUMA_STDERR,"%s: VP->vol_idcode_str = %s\n", FuncName, VP->vol_idcode_str);
00461 }
00462 /* Get the 3drotate matrix if possible*/
00463 atr = THD_find_float_atr( dset->dblk , "ROTATE_MATVEC_000000" ) ;
00464 if (atr == NULL) {
00465 VP->ROTATE_MATVEC = NULL;
00466 }else {
00467 VP->ROTATE_MATVEC = (float *)SUMA_calloc(12, sizeof(float));
00468 if (VP->ROTATE_MATVEC != NULL) {
00469 if (atr->nfl == 12) {
00470 for (ii=0; ii<12; ++ii) VP->ROTATE_MATVEC[ii] = atr->fl[ii];
00471 } else {
00472 fprintf(SUMA_STDERR,"Error %s: ROTATE_MATVEC does not have 12 elements.\n", FuncName);
00473 }
00474 } else {
00475 fprintf(SUMA_STDERR,"Error %s: Failed to allocate for VP->ROTATE_MATVEC\n", FuncName);
00476 }
00477 }
00478
00479 /* Get the tagalign matrix if possible*/
00480 atr = THD_find_float_atr( dset->dblk , "TAGALIGN_MATVEC" ) ;
00481 if (atr == NULL) {
00482 VP->TAGALIGN_MATVEC = NULL;
00483 }else {
00484 VP->TAGALIGN_MATVEC = (float *)SUMA_calloc(12, sizeof(float));
00485 if (VP->TAGALIGN_MATVEC != NULL) {
00486 if (atr->nfl == 12) {
00487 for (ii=0; ii<12; ++ii) VP->TAGALIGN_MATVEC[ii] = atr->fl[ii];
00488 } else {
00489 fprintf(SUMA_STDERR,"Error %s: TAGALIGN_MATVEC does not have 12 elements.\n", FuncName);
00490 }
00491 } else {
00492 fprintf(SUMA_STDERR,"Error %s: Failed to allocate for VP->TAGALIGN_MATVEC\n", FuncName);
00493 }
00494 }
00495
00496 /* Get the volreg matrix if possible*/
00497 atr = THD_find_float_atr( dset->dblk , "VOLREG_MATVEC_000000" ) ;
00498 if (atr == NULL) {
00499 VP->VOLREG_MATVEC = NULL;
00500 }else {
00501 VP->VOLREG_MATVEC = (float *)SUMA_calloc(12, sizeof(float));
00502 if (VP->VOLREG_MATVEC != NULL) {
00503 if (atr->nfl == 12) {
00504 for (ii=0; ii<12; ++ii) VP->VOLREG_MATVEC[ii] = atr->fl[ii];
00505 } else {
00506 fprintf(SUMA_STDERR,"Error %s: VOLREG_MATVEC_000000 does not have 12 elements.\n", FuncName);
00507 }
00508 } else {
00509 fprintf(SUMA_STDERR,"Error %s: Failed to allocate for VP->VOLREG_MATVEC\n", FuncName);
00510 }
00511 }
00512 /* Get the center base coordinates */
00513 atr = THD_find_float_atr( dset->dblk , "VOLREG_CENTER_BASE");
00514 if (atr == NULL) {
00515 VP->VOLREG_CENTER_BASE = NULL;
00516 } else {
00517 VP->VOLREG_CENTER_BASE = (float *)SUMA_calloc(3, sizeof(float));
00518 if (VP->VOLREG_CENTER_BASE != NULL) {
00519 if (atr->nfl == 3) {
00520 for (ii=0; ii<3; ++ii) VP->VOLREG_CENTER_BASE[ii] = atr->fl[ii];
00521 } else {
00522 fprintf(SUMA_STDERR,"Error %s: VOLREG_CENTER_BASE does not have 12 elements.\n", FuncName);
00523 }
00524 } else {
00525 fprintf(SUMA_STDERR,"Error %s: Failed to allocate for VP->VOLREG_CENTER_BASE\n", FuncName);
00526 }
00527 }
00528 /* VOLREG_CENTER_OLD */
00529 atr = THD_find_float_atr( dset->dblk , "VOLREG_CENTER_OLD");
00530 if (atr == NULL) {
00531 VP->VOLREG_CENTER_OLD = NULL;
00532 } else {
00533 VP->VOLREG_CENTER_OLD = (float *)SUMA_calloc(3, sizeof(float));
00534 if (VP->VOLREG_CENTER_OLD != NULL) {
00535 if (atr->nfl == 3) {
00536 for (ii=0; ii<3; ++ii) VP->VOLREG_CENTER_OLD[ii] = atr->fl[ii];
00537 } else {
00538 fprintf(SUMA_STDERR,"Error %s: VOLREG_CENTER_OLD does not have 12 elements.\n", FuncName);
00539 }
00540 } else {
00541 fprintf(SUMA_STDERR,"Error %s: Failed to allocate for VP->VOLREG_CENTER_OLD\n", FuncName);
00542 }
00543 }
00544
00545 /* Get the center base coordinates */
00546 atr = THD_find_float_atr( dset->dblk , "ROTATE_CENTER_BASE");
00547 if (atr == NULL) {
00548 VP->ROTATE_CENTER_BASE = NULL;
00549 } else {
00550 VP->ROTATE_CENTER_BASE = (float *)SUMA_calloc(3, sizeof(float));
00551 if (VP->ROTATE_CENTER_BASE != NULL) {
00552 if (atr->nfl == 3) {
00553 for (ii=0; ii<3; ++ii) VP->ROTATE_CENTER_BASE[ii] = atr->fl[ii];
00554 } else {
00555 fprintf(SUMA_STDERR,"Error %s: ROTATE_CENTER_BASE does not have 12 elements.\n", FuncName);
00556 }
00557 } else {
00558 fprintf(SUMA_STDERR,"Error %s: Failed to allocate for VP->ROTATE_CENTER_BASE\n", FuncName);
00559 }
00560 }
00561 /* ROTATE_CENTER_OLD */
00562 atr = THD_find_float_atr( dset->dblk , "ROTATE_CENTER_OLD");
00563 if (atr == NULL) {
00564 VP->ROTATE_CENTER_OLD = NULL;
00565 } else {
00566 VP->ROTATE_CENTER_OLD = (float *)SUMA_calloc(3, sizeof(float));
00567 if (VP->ROTATE_CENTER_OLD != NULL) {
00568 if (atr->nfl == 3) {
00569 for (ii=0; ii<3; ++ii) VP->ROTATE_CENTER_OLD[ii] = atr->fl[ii];
00570 } else {
00571 fprintf(SUMA_STDERR,"Error %s: ROTATE_CENTER_OLD does not have 12 elements.\n", FuncName);
00572 }
00573 } else {
00574 fprintf(SUMA_STDERR,"Error %s: Failed to allocate for VP->ROTATE_CENTER_OLD\n", FuncName);
00575 }
00576 }
00577
00578 /* handedness */
00579 VP->Hand = SUMA_THD_handedness( dset );
00580
00581 SUMA_RETURN (VP);
00582 }
|
|
||||||||||||
|
ans = SUMA_WhatAreYouToMe (SUMA_SurfaceObject *SO1, SUMA_SurfaceObject *SO2); returns a code for the kinship between two surfaces: SO1->idcode_str = SO2->idcode_str (in this case SO1 = SO2) or SO1->LocalDomainParentID = SO2->idcode_str (SO2 is the mapping reference of SO1) or SO1->idcode_str = SO2->LocalDomainParentID (SO1 is the mapping reference of SO2) SO1->LocalDomainParentID = SO2->LocalDomainParentID (SO1 and SO2 have the same mapping reference) or SO1->DomainGrandParentID = SO2->idcode_str (SO2 is the granddaddy of SO1) or SO1->idcode_str = SO2->DomainGrandParentID (SO1 is the granddaddy of SO2) or SO1->DomainGrandParentID = SO2->DomainGrandParentID (SO1 and SO2 have the same granddaddy)
Definition at line 1003 of file SUMA_DOmanip.c. References SUMA_SurfaceObject::DomainGrandParentID, SUMA_SurfaceObject::idcode_str, SUMA_SurfaceObject::LocalDomainParentID, LocalHead, SUMA_Boolean, SUMA_DOMAIN_KINSHIPS, SUMA_DOMAINS_NOT_RELATED, SUMA_ENTRY, SUMA_GPSO1_is_GPSO2, SUMA_LDPSO1_is_LDPSO2, SUMA_LH, SUMA_RETURN, SUMA_SO1_is_GPSO2, SUMA_SO1_is_LDPSO2, SUMA_SO1_is_SO2, SUMA_SO2_is_GPSO1, and SUMA_SO2_is_LDPSO1. Referenced by SUMA_isRelated(), and SUMA_RedisplayAllShowing().
01004 {
01005 static char FuncName[]={"SUMA_WhatAreYouToMe"};
01006 SUMA_Boolean LocalHead = NOPE;
01007
01008 SUMA_ENTRY;
01009
01010 if (!SO1->idcode_str || !SO2->idcode_str) {
01011 fprintf (SUMA_STDERR, "Error %s: NULL idcode_str.\n", FuncName);
01012 SUMA_RETURN (SUMA_DOMAINS_NOT_RELATED);
01013 }
01014
01015 if (strcmp (SO1->idcode_str, SO2->idcode_str) == 0) {
01016 /* SO1 = SO2 */
01017 SUMA_LH(SUMA_DomainKinships_String (SUMA_SO1_is_SO2));
01018 SUMA_RETURN (SUMA_SO1_is_SO2);
01019 }
01020
01021 if (SO1->LocalDomainParentID) {
01022 if (strcmp (SO1->LocalDomainParentID, SO2->idcode_str) == 0) {
01023 /* SO2 is the local domain parent of SO1 */
01024 SUMA_LH(SUMA_DomainKinships_String (SUMA_SO2_is_LDPSO1));
01025 SUMA_RETURN (SUMA_SO2_is_LDPSO1);
01026 }
01027 }
01028
01029 if (SO2->LocalDomainParentID) {
01030 if (strcmp (SO1->idcode_str, SO2->LocalDomainParentID) == 0) {
01031 /* SO1 is the local domain parent of SO2 */
01032 SUMA_LH(SUMA_DomainKinships_String (SUMA_SO1_is_LDPSO2));
01033 SUMA_RETURN (SUMA_SO1_is_LDPSO2);
01034 }
01035 }
01036
01037 if (SO1->LocalDomainParentID && SO2->LocalDomainParentID) {
01038 if (strcmp (SO1->LocalDomainParentID, SO2->LocalDomainParentID) == 0) {
01039 /* SO1 and SO2 have the same local domain parent */
01040 SUMA_LH(SUMA_DomainKinships_String (SUMA_LDPSO1_is_LDPSO2));
01041 SUMA_RETURN (SUMA_LDPSO1_is_LDPSO2);
01042 }
01043 }
01044
01045 if (SO1->DomainGrandParentID && SO2->idcode_str) {
01046 if (strcmp (SO1->DomainGrandParentID, SO2->idcode_str) == 0) {
01047 /* SO2 is the grand daddy of SO1 */
01048 SUMA_LH(SUMA_DomainKinships_String (SUMA_SO2_is_GPSO1));
01049 SUMA_RETURN (SUMA_SO2_is_GPSO1);
01050 }
01051 }
01052
01053 if (SO1->idcode_str && SO2->DomainGrandParentID) {
01054 if (strcmp (SO1->idcode_str, SO2->DomainGrandParentID) == 0) {
01055 /* SO1 is the grand daddy of SO2 */
01056 SUMA_LH(SUMA_DomainKinships_String (SUMA_SO1_is_GPSO2));
01057 SUMA_RETURN (SUMA_SO1_is_GPSO2);
01058 }
01059 }
01060
01061 if (SO1->DomainGrandParentID && SO2->DomainGrandParentID) {
01062 if (strcmp (SO1->DomainGrandParentID, SO2->DomainGrandParentID) == 0) {
01063 /* SO1 and SO2 have the same grand daddy */
01064 SUMA_LH(SUMA_DomainKinships_String (SUMA_GPSO1_is_GPSO2));
01065 SUMA_RETURN (SUMA_GPSO1_is_GPSO2);
01066 }
01067 }
01068
01069 SUMA_LH(SUMA_DomainKinships_String (SUMA_DOMAINS_NOT_RELATED));
01070 SUMA_RETURN (SUMA_DOMAINS_NOT_RELATED);
01071
01072 }
|
|
||||||||||||||||
|
searches for DO object with an idcode_str equal to idcode It returns the DO's index into dov -1 if nothing was found Definition at line 680 of file SUMA_DOmanip.c. References i, SUMA_SegmentDO::idcode_str, SUMA_Axis::idcode_str, SUMA_ROI::idcode_str, SUMA_DRAWN_ROI::idcode_str, SUMA_SurfaceObject::idcode_str, SUMA_ENTRY, SUMA_IS_EMPTY_STR_ATTR, and SUMA_RETURN. Referenced by SUMA_OpenDrawnROI_NIML(), and SUMA_PrepAddmappableSO().
00681 {
00682 static char FuncName[]={"SUMA_whichDO"};
00683 int i;
00684 SUMA_SurfaceObject *SO = NULL;
00685 SUMA_DRAWN_ROI *dROI = NULL;
00686 SUMA_ROI *ROI = NULL;
00687 SUMA_SegmentDO *sdo = NULL;
00688 SUMA_Axis *sax = NULL;
00689
00690 SUMA_ENTRY;
00691
00692 if (SUMA_IS_EMPTY_STR_ATTR(idcode)) { /* might come in as ~ at times */
00693 fprintf(SUMA_STDERR,"Warning %s: NULL idcode.\n", FuncName);
00694 SUMA_RETURN (-1);
00695 }
00696 for (i=0; i< N_dov; ++i) {
00697 switch (dov[i].ObjectType) {
00698 case (SO_type):
00699 SO = (SUMA_SurfaceObject *)dov[i].OP;
00700 if (strcmp(idcode, SO->idcode_str)== 0) {
00701 SUMA_RETURN (i);
00702 }
00703 break;
00704 case (ROIdO_type):
00705 dROI = (SUMA_DRAWN_ROI *)dov[i].OP;
00706 if (strcmp(idcode, dROI->idcode_str)== 0) {
00707 SUMA_RETURN (i);
00708 }
00709 break;
00710 case (ROIO_type):
00711 ROI = (SUMA_ROI *)dov[i].OP;
00712 if (strcmp(idcode, ROI->idcode_str)== 0) {
00713 SUMA_RETURN (i);
00714 }
00715 break;
00716 case (AO_type):
00717 sax = (SUMA_Axis *)dov[i].OP;
00718 if (strcmp(idcode, sax->idcode_str)== 0) {
00719 SUMA_RETURN (i);
00720 }
00721 break;
00722 case (LS_type):
00723 sdo = (SUMA_SegmentDO *)dov[i].OP;
00724 if (strcmp(idcode, sdo->idcode_str)== 0) {
00725 SUMA_RETURN (i);
00726 }
00727 break;
00728 default:
00729 fprintf(SUMA_STDERR,"Warning %s: Object type %d not checked.\n", FuncName, dov[i].ObjectType);
00730 break;
00731 }
00732 }
00733 SUMA_RETURN(-1);
00734 }
|