/*! A function version of the program mc by Thomas Lewiner see main.c in ./MarchingCubes */ SUMA_SurfaceObject *SUMA_MarchingCubesSurface( SUMA_GENERIC_PROG_OPTIONS_STRUCT * Opt) { static char FuncName[]={"SUMA_MarchingCubesSurface"}; SUMA_SurfaceObject *SO=NULL; int nxx, nyy, nzz, cnt, i, j, k, *FaceSetList=NULL; float *NodeList=NULL; SUMA_NEW_SO_OPT *nsoopt = NULL; THD_fvec3 fv, iv; MCB *mcp ; SUMA_ENTRY; if (Opt->obj_type < 0) { nxx = DSET_NX(Opt->in_vol); nyy = DSET_NY(Opt->in_vol); nzz = DSET_NZ(Opt->in_vol); if (Opt->debug) { fprintf(SUMA_STDERR, "%s:\nNxx=%d\tNyy=%d\tNzz=%d\n", FuncName, nxx, nyy, nzz); } mcp = MarchingCubes(-1, -1, -1); set_resolution( mcp, nxx, nyy, nzz ) ; init_all(mcp) ; if (Opt->debug) fprintf(SUMA_STDERR,"%s:\nSetting data...\n", FuncName); cnt = 0; for( k = 0 ; k < mcp->size_z ; k++ ) { for( j = 0 ; j < mcp->size_y ; j++ ) { for( i = 0 ; i < mcp->size_x ; i++ ) { SUMA_SET_MC_DATA ( mcp, Opt->mcdatav[cnt], i, j, k); ++cnt; } } } } else { /* built in */ nxx = nyy = nzz = Opt->obj_type_res; mcp = MarchingCubes(-1, -1, -1); set_resolution( mcp, nxx, nyy, nzz) ; init_all(mcp) ; compute_data( *mcp , Opt->obj_type) ; } if (Opt->debug) fprintf(SUMA_STDERR,"%s:\nrunning MarchingCubes...\n", FuncName); run(mcp) ; clean_temps(mcp) ; if (Opt->debug > 1) { fprintf(SUMA_STDERR,"%s:\nwriting out NodeList and FaceSetList...\n", FuncName); write1Dmcb(mcp); } if (Opt->debug) { fprintf(SUMA_STDERR,"%s:\nNow creating SO...\n", FuncName); } NodeList = (float *)SUMA_malloc(sizeof(float)*3*mcp->nverts); FaceSetList = (int *)SUMA_malloc(sizeof(int)*3*mcp->ntrigs); if (!NodeList || !FaceSetList) { SUMA_SL_Crit("Failed to allocate!"); SUMA_RETURN(SO); } nsoopt = SUMA_NewNewSOOpt(); if (Opt->obj_type < 0) { nsoopt->LargestBoxSize = -1; if (Opt->debug) { fprintf(SUMA_STDERR, "%s:\nCopying vertices, changing to DICOM \n" "Orig:(%f %f %f) \nD:(%f %f %f)...\n", FuncName, DSET_XORG(Opt->in_vol), DSET_YORG(Opt->in_vol), DSET_ZORG(Opt->in_vol), DSET_DX(Opt->in_vol), DSET_DY(Opt->in_vol), DSET_DZ(Opt->in_vol)); } for ( i = 0; i < mcp->nverts; i++ ) { j = 3*i; /* change from index coordinates to mm DICOM, next three lines are equivalent of SUMA_THD_3dfind_to_3dmm*/ fv.xyz[0] = DSET_XORG(Opt->in_vol) + mcp->vertices[i].x * DSET_DX(Opt->in_vol); fv.xyz[1] = DSET_YORG(Opt->in_vol) + mcp->vertices[i].y * DSET_DY(Opt->in_vol); fv.xyz[2] = DSET_ZORG(Opt->in_vol) + mcp->vertices[i].z * DSET_DZ(Opt->in_vol); /* change mm to RAI coords */ iv = SUMA_THD_3dmm_to_dicomm( Opt->in_vol->daxes->xxorient, Opt->in_vol->daxes->yyorient, Opt->in_vol->daxes->zzorient, fv ); NodeList[j ] = iv.xyz[0]; NodeList[j+1] = iv.xyz[1]; NodeList[j+2] = iv.xyz[2]; } for ( i = 0; i < mcp->ntrigs; i++ ) { j = 3*i; FaceSetList[j ] = mcp->triangles[i].v3; FaceSetList[j+1] = mcp->triangles[i].v2; FaceSetList[j+2] = mcp->triangles[i].v1; } } else { nsoopt->LargestBoxSize = 100; /* built in */ for ( i = 0; i < mcp->nverts; i++ ) { j = 3*i; NodeList[j ] = mcp->vertices[i].x; NodeList[j+1] = mcp->vertices[i].y; NodeList[j+2] = mcp->vertices[i].z; } for ( i = 0; i < mcp->ntrigs; i++ ) { j = 3*i; FaceSetList[j ] = mcp->triangles[i].v3; FaceSetList[j+1] = mcp->triangles[i].v2; FaceSetList[j+2] = mcp->triangles[i].v1; } } SO = SUMA_NewSO(&NodeList, mcp->nverts, &FaceSetList, mcp->ntrigs, nsoopt); if (Opt->obj_type < 0) { /* not sure if anything needs to be done here ...*/ } else { if (Opt->obj_type == 0) SO->normdir = 1; else SO->normdir = -1; } if (Opt->debug) { fprintf(SUMA_STDERR,"%s:\nCleaning mcp...\n", FuncName); } clean_all(mcp) ; free(mcp); nsoopt=SUMA_FreeNewSOOpt(nsoopt); SUMA_RETURN(SO); }
int main() { unsigned int menu; int quantity; int i; user profile; user blank; user *profiles = NULL; setlocale(LC_ALL, "Portuguese"); system("cls || clear"); system("printf \'\\033[8;45;160t\'"); clean_temps(); sleep(2); system("cls || clear"); interface(); system("cls || clear"); clean_log(); clean_domain_csv(); do { menu_interface(); printf("Escolha uma opção do menu: "); scanf("%u", &menu); while (menu > 5 || menu <= 0) { printf("Opção não reconhecida!!\n"); sleep(2); system("cls || clear"); menu_interface(); printf("Escolha uma opção do menu: "); scanf("%u", &menu); } fflush_in(); switch (menu) { case 1: profile = read_new_user(); sleep(2); system("cls || clear"); printf("Informações do novo usuário: \n"); show_user(profile); make_domain_csv(profile); make_log(profile); fflush_in(); getchar(); system("cls || clear"); break; case 2: printf("Quantos usuários deseja cadastrar?: "); scanf("%d", &quantity); fflush_in(); profiles = malloc(quantity * sizeof(user)); for (i = 0; i < quantity; ++i) { blank = make_blank_user(blank); profiles[i] = blank; } for (i = 0; i < quantity; ++i) { profile = read_new_user(); sleep(2); system("cls || clear"); printf("Informações do novo usuário: \n"); show_user(profile); fflush_in(); profiles[i] = profile; make_domain_csv(profile); make_log(profile); sleep(2); system("cls || clear"); } printf("Listando usuários criados: \n"); for (i = 0; i < quantity; ++i) { show_user(profiles[i]); printf("\n"); } printf("Todos os arquivos dos usuários estão em doc/log.txt!!\n"); printf("Aperte ENTER para continuar a execução"); getchar(); system("cls || clear"); break; case 3: system("cls || clear"); show_register_users(); break; case 4: printf("Terminando a execução...\n"); printf("Obrigado por usar o sistema!!!\n\n"); break; default: printf("Opção não válida!\n"); break; } } while (menu != 4); return 0; }