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 + -
显示快捷键?