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
00011 SUMA_SurfaceViewer *SUMAg_cSV = NULL;
00012 SUMA_SurfaceViewer *SUMAg_SVv = NULL;
00013
00014 int SUMAg_N_SVv = 0;
00015 SUMA_DO *SUMAg_DOv = NULL;
00016 int SUMAg_N_DOv = 0;
00017 SUMA_CommonFields *SUMAg_CF = NULL;
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
00037
00038
00039
00040
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
00067
00068
00069
00070
00071
00072
00073
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
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;
00096 iface = 0;
00097 iface0 = 0;
00098 while (iface < *N) {
00099 iface0 = iface ;
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];
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];
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];
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;
00142 ++iface;
00143 }
00144
00145 *N = iFS3 / 3;
00146
00147
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 {
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
00306
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
00325 SOv[ipart] = SUMA_Alloc_SurfObject_Struct(1);
00326
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
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
00361
00362 SOv[ipart]->glar_NodeList = (GLfloat *) SOv[ipart]->NodeList;
00363 SOv[ipart]->glar_FaceSetList = (GLint *) SOv[ipart]->FaceSetList;
00364 SOv[ipart]->glar_FaceNormList = (GLfloat *) SOv[ipart]->FaceNormList;
00365 SOv[ipart]->glar_NodeNormList = (GLfloat *) SOv[ipart]->NodeNormList;
00366
00367
00368 SOv[ipart]->RotationWeight = SOv[ipart]->N_Node;
00369 SOv[ipart]->ViewCenterWeight = SOv[ipart]->N_Node;
00370
00371
00372 SOv[ipart]->ShowSelectedNode = YUP;
00373 SOv[ipart]->ShowSelectedFaceSet = YUP;
00374 SOv[ipart]->SelectedFaceSet = -1;
00375 SOv[ipart]->SelectedNode = -1;
00376
00377
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
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
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;
00411
00412
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
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
00442 SUMA_ColorizePlane(NewColPlane);
00443 }
00444
00445
00446
00447
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