Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

SUMA_Homer.c

Go to the documentation of this file.
00001 #include "SUMA_suma.h"
00002 
00003 #include "SUMA_Homer.h"
00004 
00005 #if defined SUMA_Homer_STAND_ALONE
00006 #define STAND_ALONE 
00007 #endif
00008 
00009 #ifdef STAND_ALONE
00010 /* these global variables must be declared even if they will not be used by this main */
00011 SUMA_SurfaceViewer *SUMAg_cSV = NULL; /*!< Global pointer to current Surface Viewer structure*/
00012 SUMA_SurfaceViewer *SUMAg_SVv = NULL; /*!< Global pointer to the vector containing the various Surface Viewer Structures 
00013                                     SUMAg_SVv contains SUMA_MAX_SURF_VIEWERS structures */
00014 int SUMAg_N_SVv = 0; /*!< Number of SVs realized by X */
00015 SUMA_DO *SUMAg_DOv = NULL;   /*!< Global pointer to Displayable Object structure vector*/
00016 int SUMAg_N_DOv = 0; /*!< Number of DOs stored in DOv */
00017 SUMA_CommonFields *SUMAg_CF = NULL; /*!< Global pointer to structure containing info common to all viewers */
00018 #else
00019 extern SUMA_CommonFields *SUMAg_CF;
00020 extern SUMA_DO *SUMAg_DOv;
00021 extern SUMA_SurfaceViewer *SUMAg_SVv;
00022 extern int SUMAg_N_SVv; 
00023 extern int SUMAg_N_DOv;  
00024 #endif
00025 
00026 
00027 #ifdef SUMA_Homer_STAND_ALONE
00028 
00029 void usage_SUMA_Homer()
00030 {
00031    printf ("\nUsage:  SUMA_Homer\n");
00032    exit (1);
00033 }   
00034 
00035 /*!
00036    \brief Change the Vert structure to a SUMA NodeList vector
00037    \param Vert (Point3 *)
00038    \param sz_vect (int) total size of Vert
00039    \param N (int *) to contain the number of nodes in Vert
00040    \SUMA_RETURN NodeList (float *) 3Nx1 vector of XYZ coordinates.
00041 */
00042 float * SUMA_HomerVertex(Point3 *Vert, int sz_vect, int *N)
00043 {
00044    static char FuncName[]={"SUMA_HomerVertex"};
00045    float *NodeList=NULL;
00046    int i, k;
00047    SUMA_Boolean LocalHead = NOPE;
00048      
00049    SUMA_ENTRY;
00050    
00051    *N = sz_vect/sizeof(Point3);
00052    fprintf(SUMA_STDERR,"%d (%d/%d) elements in Vert.\n", 
00053       *N, sz_vect, sizeof(Point3));
00054    
00055    NodeList = (float *)SUMA_malloc(*N*3*sizeof(float));
00056    k = 0;
00057    for (i=0; i<*N; ++i) {
00058       NodeList[k] = 50.0*(float)Vert[i].x; ++k;
00059       NodeList[k] = 50.0*(float)Vert[i].y; ++k;
00060       NodeList[k] = 50.0*(float)Vert[i].z; ++k;
00061    }
00062    
00063    SUMA_RETURN(NodeList);
00064 }
00065 /*!
00066    \brief Change the face vector to a SUMA FaceSetList vector
00067    Polygons are automatically triangulated
00068    
00069    \param face (long *) vector of ace indices. Faces are separated
00070                        by -1 entries
00071    \param sz_vect (int) total size of Vert
00072    \param N (int *) to contain the number of faces is FaceSetList
00073    \SUMA_RETURN FaceSetList (int *) 3Nx1 vector of triangles making up mesh.
00074 */
00075 int * SUMA_HomerFace(long *face, int sz_vect, int *N)
00076 {
00077    static char FuncName[]={"SUMA_HomerFace"};
00078    int i, k, N_alloc, iface, iface0, iFS3;
00079    int *FaceSetList=NULL;
00080    SUMA_Boolean LocalHead = NOPE;
00081    
00082    SUMA_ENTRY;
00083    
00084    *N = sz_vect/sizeof(long);
00085    fprintf(SUMA_STDERR,"%d (%d/%d) elements in Vert.\n", 
00086       *N, sz_vect, sizeof(long));
00087    
00088    /* Can't guess ahead of time, make sure you check down the line */
00089    N_alloc = *N*3;
00090    FaceSetList = (int *)SUMA_malloc(N_alloc*sizeof(int));   
00091    if (!FaceSetList) {
00092       fprintf (SUMA_STDERR,"Error %s: Failed to reallocate.\n", FuncName);
00093       SUMA_RETURN(NULL);
00094    } 
00095    iFS3 =0; /* index of triangulated facet */
00096    iface = 0;
00097    iface0 = 0;
00098    while (iface < *N) {
00099       iface0 = iface ; /* 1s node in polygon */
00100       if (iface0 < 0) {
00101          fprintf(SUMA_STDERR, "Error %s: Unexpected end flag", FuncName);
00102          SUMA_free(FaceSetList); 
00103          SUMA_RETURN(NULL);
00104       }
00105       if (LocalHead) fprintf(SUMA_STDERR,
00106             "%s: iface0 = %d, face[%d] = %d: ", 
00107             FuncName, iface0, iface0, (int)face[iface0]) ;
00108       do {
00109          if (iFS3+3 > N_alloc) {
00110             N_alloc = 2 * N_alloc;
00111             FaceSetList = (int *)realloc((void *)FaceSetList, N_alloc * sizeof(int));
00112             if (!FaceSetList) {
00113                fprintf (SUMA_STDERR,"Error %s: Failed to reallocate.\n", FuncName);
00114                SUMA_RETURN(NULL);
00115             } 
00116          }
00117          FaceSetList[iFS3] = face[iface0]; /* first node in polygon is first node of triangles forming polygon */
00118          if (FaceSetList[iFS3] < 0) {
00119             fprintf (SUMA_STDERR,"Negative index loaded (loc 0)\n");
00120          }
00121          if (LocalHead) fprintf(SUMA_STDERR,
00122             "t(%d, ", (int)face[iface0]);
00123          if (iface == iface0) ++iface;
00124          if (LocalHead) fprintf(SUMA_STDERR,
00125             "%d, ", (int)face[iface]);
00126          ++iFS3;
00127          FaceSetList[iFS3] = face[iface]; /* node 2 */
00128          if (FaceSetList[iFS3] < 0) {
00129             fprintf (SUMA_STDERR,"Negative index loaded (loc 1)\n");
00130          }
00131          if (LocalHead) fprintf(SUMA_STDERR,
00132             "%d) ", (int)face[iface+1]);
00133          ++iFS3; 
00134          FaceSetList[iFS3] = face[iface+1]; /* node 3 */
00135          if (FaceSetList[iFS3] < 0) {
00136             fprintf (SUMA_STDERR,"Negative index loaded (loc 2)\n");
00137          }
00138          ++iFS3; ++iface; 
00139       } while (face[iface+1] >= 0);
00140       if (LocalHead) fprintf(SUMA_STDERR," iFS3/N_alloc = %d/%d\n", iFS3, N_alloc);
00141       ++iface; /* skip -1 */
00142       ++iface; /* goto next */
00143    }
00144    
00145    *N = iFS3 / 3;
00146    
00147    /* reallocate */
00148 
00149       if (LocalHead) {
00150          int tmpmin=-100, n3, itmp;
00151          n3 = 3 * *N;
00152          fprintf (SUMA_STDERR,"%s: N_FaceSet %d\n", FuncName, *N);
00153          SUMA_MIN_VEC (FaceSetList, n3, tmpmin);
00154          fprintf (SUMA_STDERR,"Minimum index is %d\n", tmpmin);
00155          if (tmpmin < 0) {
00156             fprintf (SUMA_STDERR,"Error %s: Bad ass pre-alloc negative number\n", FuncName);
00157             for (itmp=0; itmp<n3; ++itmp) {
00158                fprintf (SUMA_STDERR, "%d: %d\n", itmp, FaceSetList[itmp]);
00159                if (FaceSetList[itmp] < 0) {
00160                   fprintf (SUMA_STDERR,"%s: Min of %d, at %d\n", FuncName, FaceSetList[itmp], itmp);
00161                }
00162             } 
00163          }
00164       }
00165 
00166    FaceSetList = (int *)SUMA_realloc((void *)FaceSetList, iFS3 * sizeof(int));
00167       if (LocalHead) {
00168          int tmpmin=-100, n3, itmp;
00169          n3 = 3 * *N;
00170          fprintf (SUMA_STDERR,"%s: N_FaceSet %d\n", FuncName, *N);
00171          SUMA_MIN_VEC (FaceSetList, n3, tmpmin);
00172          fprintf (SUMA_STDERR,"Minimum index is %d\n", tmpmin);
00173          if (tmpmin < 0) {
00174             fprintf (SUMA_STDERR,"Error %s: Bad post realloc ass negative number\n", FuncName);
00175             for (itmp=0; itmp<n3; ++itmp) {
00176                fprintf (SUMA_STDERR, "%d: %d\n", itmp, FaceSetList[itmp]);
00177                if (FaceSetList[itmp] < 0) {
00178                   fprintf (SUMA_STDERR,"%s: Min of %d, at %d\n", FuncName, FaceSetList[itmp], itmp);
00179                }
00180             } 
00181          }
00182       }
00183    
00184    
00185    fprintf(SUMA_STDERR,"%s: Returning (iFS3 = %d, N = %d...)\n", FuncName, iFS3, *N);
00186    
00187    SUMA_RETURN(FaceSetList); 
00188 }
00189 
00190 int main (int argc,char *argv[])
00191 {/* Main */
00192    static char FuncName[]={"SUMA_Homer"}; 
00193    float *NodeList = NULL;
00194    int N_Node = 0, N_FaceSet = 0,
00195       N_parts = 0, ipart=0;
00196    int *FaceSetList = NULL;
00197    char sbuf[100], fName[100];
00198    SUMA_SURF_NORM SN;
00199    SUMA_OVERLAYS *NewColPlane=NULL;
00200    SUMA_SurfaceObject **SOv=NULL;
00201    FILE *SpecOut = NULL;
00202    SUMA_Boolean LocalHead = NOPE;
00203    
00204    SUMA_mainENTRY;
00205    
00206         SUMA_STANDALONE_INIT;
00207 
00208    
00209    N_parts = 19;
00210    SOv = (SUMA_SurfaceObject **) SUMA_malloc(N_parts * sizeof(SUMA_SurfaceObject *));
00211    
00212    SpecOut = fopen("HJS.spec", "w");
00213    if (!SpecOut) {
00214       fprintf(SUMA_STDERR,"Error %s: Failed in opening spec file.\n", FuncName);
00215                 exit(1);
00216    }
00217    
00218    fprintf (SpecOut,"\tGroup = HJS\n");
00219    fprintf (SpecOut,"\tStateDef = Duffed\n"); 
00220 
00221    for (ipart = 0; ipart < N_parts; ++ipart) {
00222       switch (ipart) {
00223          case 0:      
00224             NodeList = SUMA_HomerVertex(X1_X5_Sphere_vertex, sizeof(X1_X5_Sphere_vertex), &N_Node);
00225             FaceSetList = SUMA_HomerFace(X1_X5_Sphere_face, sizeof(X1_X5_Sphere_face), &N_FaceSet);
00226             break;
00227          case 1:
00228             NodeList = SUMA_HomerVertex(X1_X5_X12_lleg_vertex, sizeof(X1_X5_X12_lleg_vertex), &N_Node);
00229             FaceSetList = SUMA_HomerFace(X1_X5_X12_lleg_face, sizeof(X1_X5_X12_lleg_face), &N_FaceSet);
00230             break;
00231          case 2:
00232             NodeList = SUMA_HomerVertex(X1_X5_X12_Rleg_vertex, sizeof(X1_X5_X12_Rleg_vertex), &N_Node);
00233             FaceSetList = SUMA_HomerFace(X1_X5_X12_Rleg_face, sizeof(X1_X5_X12_Rleg_face), &N_FaceSet);
00234             break;
00235          case 3:
00236             NodeList = SUMA_HomerVertex(X1_X5_X12_Sphere_vertex, sizeof(X1_X5_X12_Sphere_vertex), &N_Node);
00237             FaceSetList = SUMA_HomerFace(X1_X5_X12_Sphere_face, sizeof(X1_X5_X12_Sphere_face), &N_FaceSet);
00238             break;
00239          case 4:
00240             NodeList = SUMA_HomerVertex(X1_X5_X12_X31_Sphere_vertex, sizeof(X1_X5_X12_X31_Sphere_vertex), &N_Node);
00241             FaceSetList = SUMA_HomerFace(X1_X5_X12_X31_Sphere_face, sizeof(X1_X5_X12_X31_Sphere_face), &N_FaceSet);
00242             break;
00243          case 5:
00244             NodeList = SUMA_HomerVertex(X1_X5_X44_X45_vertex, sizeof(X1_X5_X44_X45_vertex), &N_Node);
00245             FaceSetList = SUMA_HomerFace(X1_X5_X44_X45_face, sizeof(X1_X5_X44_X45_face), &N_FaceSet);
00246             break;
00247          case 6:
00248             NodeList = SUMA_HomerVertex(X1_X5_X44_Torus_vertex, sizeof(X1_X5_X44_Torus_vertex), &N_Node);
00249             FaceSetList = SUMA_HomerFace(X1_X5_X44_Torus_face, sizeof(X1_X5_X44_Torus_face), &N_FaceSet);
00250             break;
00251          case 7:
00252             NodeList = SUMA_HomerVertex(X1_X5_X44_X57_Sphere_vertex, sizeof(X1_X5_X44_X57_Sphere_vertex), &N_Node);
00253             FaceSetList = SUMA_HomerFace(X1_X5_X44_X57_Sphere_face, sizeof(X1_X5_X44_X57_Sphere_face), &N_FaceSet);
00254             break;
00255          case 8:
00256             NodeList = SUMA_HomerVertex(X1_X5_X44_X88_Sphere_vertex, sizeof(X1_X5_X44_X88_Sphere_vertex), &N_Node);
00257             FaceSetList = SUMA_HomerFace(X1_X5_X44_X88_Sphere_face, sizeof(X1_X5_X44_X88_Sphere_face), &N_FaceSet);
00258             break;
00259          case 9:
00260             NodeList = SUMA_HomerVertex(X1_X5_X44_X88_X95_Sphere_vertex, sizeof(X1_X5_X44_X88_X95_Sphere_vertex), &N_Node);
00261             FaceSetList = SUMA_HomerFace(X1_X5_X44_X88_X95_Sphere_face, sizeof(X1_X5_X44_X88_X95_Sphere_face), &N_FaceSet);
00262             break;
00263          case 10:
00264             NodeList = SUMA_HomerVertex(X1_X5_X120_Sphere_Sphere_vertex, sizeof(X1_X5_X120_Sphere_Sphere_vertex), &N_Node);
00265             FaceSetList = SUMA_HomerFace(X1_X5_X120_Sphere_Sphere_face, sizeof(X1_X5_X120_Sphere_Sphere_face), &N_FaceSet);
00266             break;
00267          case 11:
00268             NodeList = SUMA_HomerVertex(X1_X5_X120_X127_Sphere_vertex, sizeof(X1_X5_X120_X127_Sphere_vertex), &N_Node);
00269             FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_Sphere_face, sizeof(X1_X5_X120_X127_Sphere_face), &N_FaceSet);
00270             break;
00271          case 12:
00272             NodeList = SUMA_HomerVertex(X1_X5_X120_X127_X134_vertex, sizeof(X1_X5_X120_X127_X134_vertex), &N_Node);
00273             FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_X134_face, sizeof(X1_X5_X120_X127_X134_face), &N_FaceSet);
00274             break;
00275          case 13:
00276             NodeList = SUMA_HomerVertex(X1_X5_X120_X127_Torus_vertex, sizeof(X1_X5_X120_X127_Torus_vertex), &N_Node);
00277             FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_Torus_face, sizeof(X1_X5_X120_X127_Torus_face), &N_FaceSet);
00278             break;
00279          case 14:
00280             NodeList = SUMA_HomerVertex(X1_X5_X120_X127_X146_vertex, sizeof(X1_X5_X120_X127_X146_vertex), &N_Node);
00281             FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_X146_face, sizeof(X1_X5_X120_X127_X146_face), &N_FaceSet);
00282             break;
00283          case 15:
00284             NodeList = SUMA_HomerVertex(X1_X5_X120_X127_X152_vertex, sizeof(X1_X5_X120_X127_X152_vertex), &N_Node);
00285             FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_X152_face, sizeof(X1_X5_X120_X127_X152_face), &N_FaceSet);
00286             break;
00287          case 16:
00288             NodeList = SUMA_HomerVertex(X1_X5_X120_X127_X158_vertex, sizeof(X1_X5_X120_X127_X158_vertex), &N_Node);
00289             FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_X158_face, sizeof(X1_X5_X120_X127_X158_face), &N_FaceSet);
00290             break;
00291          case 17:
00292             NodeList = SUMA_HomerVertex(X1_X5_X120_X127_X164_Sphere_vertex, sizeof(X1_X5_X120_X127_X164_Sphere_vertex), &N_Node);
00293             FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_X164_Sphere_face, sizeof(X1_X5_X120_X127_X164_Sphere_face), &N_FaceSet);
00294             break;
00295          case 18:
00296             NodeList = SUMA_HomerVertex(X1_X5_X120_X127_X177_Torus_vertex, sizeof(X1_X5_X120_X127_X177_Torus_vertex), &N_Node);
00297             FaceSetList = SUMA_HomerFace(X1_X5_X120_X127_X177_Torus_face, sizeof(X1_X5_X120_X127_X177_Torus_face), &N_FaceSet);
00298             break;
00299          default:
00300             SUMA_SL_Err("No more parts");
00301             SUMA_RETURN(-1);
00302             break;
00303       }
00304                      
00305       /* SUMA_disp_vect(NodeList, 3*N_Node); */
00306       /* SUMA_disp_dvect(FaceSetList, 3*N_FaceSet);  */
00307       if (LocalHead) {
00308          int tmpmin=-100, n3, itmp;
00309          n3 = 3 * N_FaceSet;
00310          fprintf (SUMA_STDERR,"%s: N_Node %d, N_FaceSet %d\n", FuncName, N_Node, N_FaceSet);
00311          SUMA_MIN_VEC (FaceSetList, n3, tmpmin);
00312          fprintf (SUMA_STDERR,"Minimum index is %d\n", tmpmin);
00313          if (tmpmin < 0) {
00314             fprintf (SUMA_STDERR,"Error %s: Bad in return ass negative number\n", FuncName);
00315             for (itmp=0; itmp<n3; ++itmp) {
00316                fprintf (SUMA_STDERR, "%d: %d\n", itmp, FaceSetList[itmp]);
00317                if (FaceSetList[itmp] < 0) {
00318                   fprintf (SUMA_STDERR,"%s: Min of %d, at %d\n", FuncName, FaceSetList[itmp], itmp);
00319                }
00320             } 
00321          }
00322       }
00323       
00324       /* No create an SO for that thing */
00325       SOv[ipart] = SUMA_Alloc_SurfObject_Struct(1);
00326       /* calculate the curvatures */
00327       SOv[ipart]->NodeList = NodeList;
00328       SOv[ipart]->N_Node = N_Node;
00329       SOv[ipart]->FaceSetList = FaceSetList;
00330       SOv[ipart]->N_FaceSet = N_FaceSet;
00331       sprintf (fName, "Springfield/HomerJaySimpson_%d", ipart);
00332       SOv[ipart]->Group = SUMA_copy_string("HJS");
00333       SOv[ipart]->State = SUMA_copy_string("Duffed");
00334       SOv[ipart]->Name = SUMA_StripPath(fName);
00335       SOv[ipart]->FileType = SUMA_PLY;
00336       SOv[ipart]->FileFormat = SUMA_FF_NOT_SPECIFIED;
00337       SOv[ipart]->idcode_str = UNIQ_hashcode(fName); 
00338       SOv[ipart]->SUMA_VolPar_Aligned = NOPE;
00339       SOv[ipart]->VolPar = NULL;
00340       SOv[ipart]->NodeDim = 3;
00341       SOv[ipart]->FaceSetDim = 3;
00342       
00343       SUMA_MIN_MAX_SUM_VECMAT_COL (
00344          SOv[ipart]->NodeList, SOv[ipart]->N_Node, SOv[ipart]->NodeDim, 
00345          SOv[ipart]->MinDims, SOv[ipart]->MaxDims, SOv[ipart]->Center);
00346 
00347       SOv[ipart]->Center[0] /= SOv[ipart]->N_Node;
00348       SOv[ipart]->Center[1] /= SOv[ipart]->N_Node;
00349       SOv[ipart]->Center[2] /= SOv[ipart]->N_Node;
00350 
00351       SUMA_MIN_VEC (SOv[ipart]->MinDims, 3, SOv[ipart]->aMinDims );
00352       SUMA_MAX_VEC (SOv[ipart]->MaxDims, 3, SOv[ipart]->aMaxDims);
00353       
00354       /* Calculate SurfaceNormals */
00355       SN = SUMA_SurfNorm(SOv[ipart]->NodeList,  SOv[ipart]->N_Node, 
00356                   SOv[ipart]->FaceSetList, SOv[ipart]->N_FaceSet );
00357       SOv[ipart]->NodeNormList = SN.NodeNormList;
00358       SOv[ipart]->FaceNormList = SN.FaceNormList;
00359 
00360       /*create the structures for GL rendering */
00361       /*The data is being duplicated at the moment and perhaps I should just stick with the 1D stuf */
00362       SOv[ipart]->glar_NodeList = (GLfloat *) SOv[ipart]->NodeList; /* just copy the pointer, not the data */
00363       SOv[ipart]->glar_FaceSetList = (GLint *) SOv[ipart]->FaceSetList; /* just copy the pointer, not the data */
00364       SOv[ipart]->glar_FaceNormList = (GLfloat *) SOv[ipart]->FaceNormList; /* just copy the pointer, not the data */
00365       SOv[ipart]->glar_NodeNormList = (GLfloat *) SOv[ipart]->NodeNormList; /* just copy the pointer, not the data */
00366 
00367       /* a surface object does contribute to the rotation center of the viewer displaying it */
00368       SOv[ipart]->RotationWeight = SOv[ipart]->N_Node;
00369       SOv[ipart]->ViewCenterWeight = SOv[ipart]->N_Node;
00370 
00371       /* No selections yet, but make the preps */
00372       SOv[ipart]->ShowSelectedNode = YUP;
00373       SOv[ipart]->ShowSelectedFaceSet = YUP;
00374       SOv[ipart]->SelectedFaceSet = -1;
00375       SOv[ipart]->SelectedNode = -1;
00376       
00377       /* create the ball object*/
00378       SOv[ipart]->NodeMarker = SUMA_Alloc_SphereMarker ();
00379       if (SOv[ipart]->NodeMarker == NULL) {
00380          fprintf(SUMA_STDERR,"Error%s: Could not allocate for SOv[ipart]->NodeMarker\n", FuncName);
00381          SUMA_Free_Surface_Object (SOv[ipart]);
00382          SUMA_RETURN (1);
00383       }
00384       /* create the FaceSetMarker object */
00385       SOv[ipart]->FaceSetMarker = SUMA_Alloc_FaceSetMarker();
00386       if (SOv[ipart]->FaceSetMarker == NULL) {
00387          fprintf(SUMA_STDERR,"Error%s: Could not allocate for SOv[ipart]->FaceSetMarker\n", FuncName);
00388          SUMA_Free_Surface_Object (SOv[ipart]);
00389          SUMA_RETURN (1);
00390       }
00391       
00392       /* make it its own mapping reference */
00393       SOv[ipart]->LocalDomainParentID = SUMA_copy_string (SOv[ipart]->idcode_str);
00394       
00395       if (SUMA_existSO (SOv[ipart]->idcode_str, SUMAg_DOv, SUMAg_N_DOv)) {
00396          fprintf(SUMA_STDERR,"Error %s: Surface %d is specifed more than once, multiple copies ignored.\n",
00397              FuncName, ipart);
00398          SUMA_Free_Surface_Object (SOv[ipart]);
00399          SUMA_RETURN (1);
00400       }
00401       
00402       SUMA_LH("Doing Metrics...");
00403       if (!SUMA_SurfaceMetrics (SOv[ipart], "Convexity, EdgeList, MemberFace", NULL)) {
00404          fprintf (SUMA_STDERR,"Error %s: Failed in SUMA_SurfaceMetrics.\n", FuncName);
00405          SUMA_Free_Surface_Object (SOv[ipart]);
00406          SUMA_RETURN (1);
00407       }
00408 
00409             {
00410                SUMA_DSET *dset=NULL;/* create the color plane for Convexity*/
00411              
00412              /* create an overlay plane */
00413                if (!(dset = (SUMA_DSET *)SUMA_GetCx(SOv[ipart]->idcode_str, SUMAg_CF->DsetList, 1))) {
00414                   SUMA_SL_Err("Failed to find dset!");
00415                   SUMA_RETURN (NOPE);
00416                }
00417                NewColPlane = SUMA_CreateOverlayPointer (SOv[ipart]->N_Node, "Convexity", dset, SOv[ipart]->idcode_str);
00418                if (!NewColPlane) {
00419                   fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_CreateOverlayPointer.\n", FuncName);
00420                   SUMA_RETURN (NOPE);
00421                } 
00422                
00423                /* Add this plane to SOv[ipart]->Overlays */
00424                if (!SUMA_AddNewPlane (SOv[ipart], NewColPlane, NULL, -1, 0)) {
00425                   SUMA_SL_Crit("Failed in SUMA_AddNewPlane");
00426                   SUMA_FreeOverlayPointer(NewColPlane);
00427                   SUMA_RETURN (NOPE);
00428                }
00429                
00430                if (!SUMAg_CF->scm) {   
00431                   SUMAg_CF->scm = SUMA_Build_Color_maps();
00432                   if (!SUMAg_CF->scm) {
00433                      SUMA_SL_Err("Failed to build color maps.\n");
00434                      SUMA_RETURN (NOPE);
00435                   }
00436                }
00437                if (!SUMA_SetConvexityPlaneDefaults(SOv[ipart], SUMAg_CF->DsetList)) {
00438                   SUMA_SL_Err("Failed to set plane defaults."); SUMA_RETURN(NOPE);
00439                }
00440 
00441                /* colorize the plane */
00442                SUMA_ColorizePlane(NewColPlane);
00443             }
00444 
00445       /* all the previous stuff is nice and dandy but it takes a lot more to
00446          get this thing working */
00447       /* Write out the surfaces in PLY format and create a dummy spec file */
00448       if (!SUMA_Save_Surface_Object (  fName, SOv[ipart], 
00449                                        SUMA_PLY, SUMA_FF_NOT_SPECIFIED, NULL)) {
00450          fprintf (SUMA_STDERR,"Error %s: Failed to write surface object.\n", FuncName);
00451          exit (1);
00452       }
00453 
00454       fprintf (SpecOut,"NewSurface\n");
00455       fprintf (SpecOut, "\tSurfaceFormat = ASCII\n");
00456       fprintf (SpecOut, "\tSurfaceType = Ply\n");
00457       fprintf (SpecOut, "\tSurfaceName = %s\n", fName);
00458       fprintf (SpecOut, "\tMappingRef = SAME\n");
00459       fprintf (SpecOut, "\tSurfaceState = %s\n", SOv[ipart]->State);
00460       fprintf (SpecOut, "\tEmbedDimension = 3\n\n");
00461 
00462       
00463    }   
00464    if (SpecOut) fclose (SpecOut);
00465    SUMA_RETURN(0);
00466 }
00467 #endif
 

Powered by Plone

This site conforms to the following standards: