menus.c
来自「FreeFem++可以生成高质量的有限元网格。可以用于流体力学」· C语言 代码 · 共 1,182 行 · 第 1/3 页
C
1,182 行
sc = cv.scene[currentScene()]; mesh = cv.mesh[sc->idmesh]; cube = sc->cube; switch(key) { case 'C': /* toggle clipping */ if ( cube->active & C_ON ) cube->active &= ~(C_ON+C_EDIT); else cube->active |= C_ON; break; case 'E': /* edit clip plane */ if ( !(cube->active & C_ON) ) return; if ( cube->active & C_FREEZE ) cube->active ^= C_FREEZE; cube->active ^= C_EDIT; break; case 'F': /* freeze cube */ if ( !(cube->active & C_ON) ) return; if ( cube->active & C_EDIT ) cube->active ^= C_EDIT; cube->active ^= C_FREEZE; break; case 'R': /* reset cube */ if ( !(cube->active & C_ON) ) break; resetCube(sc,cube,mesh); break; } if ( post ) glutPostRedisplay();}void keyFeature(unsigned char key,int x,int y) { pScene sc; pMesh mesh; ubyte post=TRUE,dolist=TRUE; /* default */ sc = cv.scene[currentScene()]; mesh = cv.mesh[sc->idmesh]; switch(key) { case 'S': /* shrink mode */ case 'V': /* volumic shrink */ if ( sc->shrink < 0.99 ) sc->shrink = 1.0f; else sc->shrink = 0.95; dolist = TRUE; break; case 'I': /* increase shrink value */ if ( sc->shrink > 0.99 ) break; sc->shrink -= .05; if ( sc->shrink < 0.1 ) sc->shrink = 0.1; dolist = TRUE; break; case 'i': /* decrease shrink value */ if ( sc->shrink > 0.99 ) break; sc->shrink += .05; if ( sc->shrink > 0.95 ) sc->shrink = 0.95; dolist = TRUE; break; case 's': /* scissor mode */ if ( mesh->dim == 2 ) break; sc->type ^= S_SCISSOR; if ( sc->type & S_SCISSOR ) glutDisplayFunc(scissorScene); else { glutDisplayFunc(redrawScene); reshapeScene(sc->par.xs,sc->par.ys); } break; } if ( dolist == TRUE ) { doLists(sc,mesh); if ( sc->mode & S_MAP ) doMapLists(sc,mesh,1); /*if ( sc->isotyp ) doIsoLists(sc,mesh,1);*/ } if ( post == TRUE ) glutPostRedisplay();}void menuFeature(int item) { keyFeature((unsigned char)item,0,0);}void menuImage(int item) { imgtype = item;}void keyMetric(unsigned char key,int x,int y) { pScene sc; pMesh mesh; pPoint ppt; float maxd; int k,kk; ubyte post=TRUE; /* default */ sc = cv.scene[currentScene()]; mesh = cv.mesh[sc->idmesh]; switch(key) { case 'c': /* critical points */ if ( !mesh->nbb ) return; sc->isotyp ^= S_CRITP; doIsoLists(sc,mesh,0); break; case 'f': /* flush streamlines */ if ( sc->stream->nbstl ) { for (kk=0; kk<sc->stream->nbstl; kk++) { if ( sc->slist[kk] ) glDeleteLists(sc->slist[kk],1); sc->slist[kk] = (GLuint)0; } sc->stream->nbstl = 0; for (k=1; k<=mesh->np; k++) { ppt = &mesh->point[k]; ppt->flag = 0; } } break; case 'l': /* iso-lines */ if ( !mesh->nbb ) return; sc->isotyp ^= S_ISOLINE; doIsoLists(sc,mesh,0); break; case 's': /* iso-surfaces */ if ( !mesh->nbb ) return; sc->isotyp ^= S_ISOSURF; doIsoLists(sc,mesh,0); break; case 'u': /* field lines animation */ if ( !mesh->nbb || mesh->nfield != mesh->dim ) return; if ( refitem ) { sc->isotyp |= S_PARTICLE; createParticle(sc,mesh); } glutIdleFunc(streamIdle); break; case 'd': /* displacement */ if ( !mesh->nbb || mesh->nfield != mesh->dim ) return; sc->mode ^= S_DISPL; meshCoord(mesh,(sc->mode & S_DISPL) ? 1 : 0); meshBox(mesh,1); doLists(sc,mesh); if ( sc->mode & S_MAP ) doMapLists(sc,mesh,1); if ( sc->isotyp ) doIsoLists(sc,mesh,1); break; case 'v': /* streamlines */ if ( !mesh->nbb || mesh->nfield != mesh->dim ) return; if ( refitem ) { sc->isotyp |= S_STREAML; doIsoLists(sc,mesh,0); } else { if ( !streamIsoPoint(sc,mesh) ) { post = FALSE; sc->isotyp &= ~S_STREAML; } } break; case 'w': /*vector/tensor */ if ( mesh->nfield != mesh->dim ) { if ( mesh->dim==2 && mesh->nfield == 3 ) { if ( sc->picklist ) { glDeleteLists(sc->picklist,1); sc->picklist = 0; break; } else sc->picklist = drawAllEllipse(sc,mesh); break; } return; } sc->isotyp ^= S_VECTOR; if ( mesh->dim == 3 ) if ( mesh->ntet+mesh->nhex && !(sc->clip->active & C_ON) ) return; doIsoLists(sc,mesh,0); break; case 'k': /* toggle elevation */ if ( mesh->dim != 2 ) return; sc->mode ^= S_ALTITUDE; if ( altcoef == 0.0 ) { maxd = max(mesh->xmax-mesh->xmin,mesh->ymax-mesh->ymin); altcoef = 0.3*maxd / mesh->bbmax; } if ( !(sc->mode & S_ALTITUDE) ) sc->type |= S_RESET; doMapLists(sc,mesh,1); break; case 'K': /* elevation coeff */ fprintf(stdout,"elevation coeff (%.2f): ",altcoef); fflush(stdout); fflush(stdin); fscanf(stdin,"%f",&altcoef); if ( altcoef == 0.0 ) sc->mode |= ~S_ALTITUDE; sc->type |= S_RESET; doMapLists(sc,mesh,1); doIsoLists(sc,mesh,1); break; case 'm': /* display metric */ if ( !mesh->nbb ) return; sc->mode ^= S_MAP; doMapLists(sc,mesh,1); if ( sc->mode & S_MAP ) { if ( sc->clip->active & C_ON ) sc->clip->active |= C_REDO; if ( !(sc->item & S_PALETTE) ) sc->item ^= S_PALETTE; } else if ( sc->item & S_PALETTE ) sc->item ^= S_PALETTE; break; case 'p': /* toggle palette */ if ( !mesh->nbb ) return; sc->item ^= S_PALETTE; break; default: post = FALSE; break; } if ( post ) glutPostRedisplay();}void menuMetric(int item) { keyMetric((unsigned char)item,0,0);}int createMenus(pScene sc,pMesh mesh) { int menu,amenu,fmenu,femenu,vmenu,mmenu,smenu; int clmenu,cmenu,vwmenu,trmenu; /* default */ if ( ddebug ) printf("create menus\n"); smenu = 0; /* File management menu */ fmenu = glutCreateMenu(menuFile); glutAddMenuEntry("[L] Load prefs",'L'); glutAddMenuEntry("[W] Save prefs",'W'); glutAddMenuEntry(" Update mesh",'R'); glutAddMenuEntry(" Save mesh",'S'); glutAddMenuEntry("[H] Hardcopy PPM",'H'); glutAddMenuEntry(" Hardcopy EPS (Color)",'C'); glutAddMenuEntry(" Hardcopy EPS (Grey)",'G'); glutAddMenuEntry(" Hardcopy EPS (B/W)",'B'); glutAddMenuEntry(" Softcopy EPS",'s'); /* rendering mode selector */ mmenu = glutCreateMenu(menuMode); glutAddMenuEntry("Wireframe",'W'); glutAddMenuEntry("Depth lines",'D'); glutAddMenuEntry("Hidden lines",'H'); glutAddMenuEntry("Shading",'S'); glutAddMenuEntry("Shading+lines",'P'); if ( mesh->nvn > 0 ) glutAddMenuEntry("[n] Toggle Normals",'n'); /* color & material menu */ cmenu = glutCreateMenu(menuColor); glutAddMenuEntry("[b] Toggle backcolor",'b'); glutAddMenuEntry("[e] Toggle matcolors",'e'); glutAddMenuEntry("[E] Edit matcolors",'E'); glutAddMenuEntry("[r] Hide material",'r'); glutAddMenuEntry("[R] Reset materials",'R'); /* metric */ if ( mesh->nbb > 0 ) { smenu = glutCreateMenu(menuMetric); glutAddMenuEntry("[m] Toggle metric",'m'); glutAddMenuEntry("[p] Toggle palette",'p'); if ( mesh->typage == 2 ) glutAddMenuEntry("[o] Toggle iso-lines",'l'); if ( mesh->ntet+mesh->nhex > 0 && mesh->nfield == 1 ) glutAddMenuEntry(" Toggle iso-surfaces",'s'); if ( mesh->nfield == mesh->dim ) { glutAddMenuEntry("[w] Toggle vector/tensor",'w'); glutAddMenuEntry(" Toggle displacement",'d'); glutAddMenuEntry("[v] Toggle streamlines",'v'); glutAddMenuEntry(" Flush streamlines",'f'); glutAddMenuEntry(" Particle advection",'u'); if ( mesh->dim == 2 ) glutAddMenuEntry(" Critical points",'c'); } if ( mesh->dim == 2 ) { glutAddMenuEntry("[k] Toggle elevation",'k'); glutAddMenuEntry("[K] Elevation coeff",'K'); } } /* Show misc. items */ vmenu = glutCreateMenu(menuItem); glutAddMenuEntry("[A] Axis",'A'); glutAddMenuEntry("[B] Bounding box",'B'); glutAddMenuEntry("[G] Grid ",'G'); if ( sc->glist ) glutAddMenuEntry("[g] Geometric items",'g'); glutAddMenuEntry("[j] Toggle Info",'j'); glutAddMenuEntry("[P] Toggle Point num",'P'); glutAddMenuEntry("[F] Toggle Face num",'F'); if ( mesh->nvn ) { glutAddMenuEntry("[N] Toggle normals",'N'); glutAddMenuEntry("[O] Revert normals",'O'); } /* clipping menu */ clmenu = glutCreateMenu(menuClip); glutAddMenuEntry("[F1] Toggle clip",'C'); glutAddMenuEntry("[F2] Edit clip",'E'); glutAddMenuEntry("[F3] Freeze clip",'F'); glutAddMenuEntry(" Inverse orient",'I'); if ( mesh->ntet+mesh->nhex > 0 ) glutAddMenuEntry(" Toggle capping",'K'); glutAddMenuEntry(" Toggle plane",'H'); glutAddMenuEntry(" -- Reset clip",'R'); if ( mesh->ntet+mesh->nhex > 0 ) { sc->clip->active |= C_VOL; glutAddMenuEntry("[F4] Toggle Vclip",'Z'); } /* feature menu */ femenu = glutCreateMenu(menuFeature); if ( mesh->ntet+mesh->nhex > 0 ) glutAddMenuEntry("[F5] Toggle Vshrink",'V'); else glutAddMenuEntry("[F5] Toggle shrink",'S'); glutAddMenuEntry("[F6] Increase shrink",'I'); glutAddMenuEntry("[F7] Decrease shrink",'i'); if ( mesh->dim == 3 ) glutAddMenuEntry("Toggle splitview",'s'); /* view handler menu */ vwmenu = glutCreateMenu(menuView); glutAddMenuEntry("[i] Reset",'R'); glutAddMenuEntry("[Alt-c] Copy",'C'); glutAddMenuEntry("[Alt-p] Paste",'P'); glutAddMenuEntry("[Alt+l] Link",'L'); glutAddMenuEntry("[Alt+u] Unlink",'U'); /*glutAddMenuEntry("[Alt+d] Duplicate",'D');*/ /* animation menu */ amenu = glutCreateMenu(menuAnim); glutAddMenuEntry("[a] Toggle Anim",'A'); glutAddMenuEntry("Toggle ImgSave",'I'); if ( option == SEQUENCE || option == SEQUENCE + PARTICLE ) { glutAddMenuEntry("Play sequence",'S'); glutAddMenuEntry("First mesh",'f'); glutAddMenuEntry("Last mesh",'l'); glutAddMenuEntry("Next mesh",'n'); glutAddMenuEntry("Prev mesh",'p'); } else if ( option == MORPHING ) { glutAddMenuEntry("Start/Stop morph.",'M'); glutAddMenuEntry("Toggle AutoReverse",'R'); } /* trajectoire menu */ if ( mesh->dim == 3 || mesh->nbb ) { trmenu = glutCreateMenu(menuTrajet); glutAddMenuEntry("New Ctrl point",'C'); glutAddMenuEntry("Toggle path",'S'); glutAddMenuEntry("Follow path",'F'); glutAddMenuEntry("Load path",'L'); glutAddMenuEntry("Save path",'W'); } else trmenu = 0; /* main scene menu */ menu = glutCreateMenu(menuScene); glutAddSubMenu("File",fmenu); glutAddSubMenu("Render mode",mmenu); glutAddSubMenu("Colors, Materials",cmenu); if ( mesh->nbb ) glutAddSubMenu("Data",smenu); glutAddSubMenu("Items",vmenu); if ( mesh->dim == 3 ) glutAddSubMenu("Clipping",clmenu); glutAddSubMenu("Features",femenu); glutAddSubMenu("View",vwmenu); glutAddSubMenu("Animation",amenu); /*if ( trmenu ) glutAddSubMenu("Trajectory",trmenu); */ glutAddMenuEntry("",'\0'); glutAddMenuEntry("Close window",'X'); glutAddMenuEntry("Quit",'q'); return(1);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?