diff --git a/Common/Context.h b/Common/Context.h index ff17a1187a018fd39836199009e47414f931d9eb..601aecd38377bf241c9c2d3a7b55a3e4cdd885e3 100644 --- a/Common/Context.h +++ b/Common/Context.h @@ -252,6 +252,8 @@ class CTX { int posElementary, posElement, posGamma, posEta, posRho, posDisto; int compositeWindows, deleteTmpFiles, background; int width, height; + double parameter, parameterFirst, parameterLast, parameterSteps; + std::string parameterCommand; } print; // color options struct{ diff --git a/Common/CreateFile.cpp b/Common/CreateFile.cpp index 83d3a653faed2a9118b76f4206f7500501c1d49f..7323f80a0aba9ecf22d50a86719230c6e1d557d3 100644 --- a/Common/CreateFile.cpp +++ b/Common/CreateFile.cpp @@ -10,6 +10,7 @@ #include "StringUtils.h" #include "Context.h" #include "Options.h" +#include "OpenFile.h" #include "OS.h" #if defined(HAVE_OPENGL) @@ -208,6 +209,19 @@ static PixelBuffer *GetCompositePixelBuffer(GLenum format, GLenum type) } #endif +static void change_print_parameter(int frame) +{ + double first = CTX::instance()->print.parameterFirst; + double last = CTX::instance()->print.parameterLast; + double steps = CTX::instance()->print.parameterSteps; + if(steps <= 0) steps = 1; + double step = (last - first) / steps; + double v = first + frame * step * CTX::instance()->post.animStep; + Msg::Info("Setting Print.Parameter = %g", v); + opt_print_parameter(0, GMSH_SET | GMSH_GUI, v); + ParseString(CTX::instance()->print.parameterCommand); +} + void CreateOutputFile(const std::string &fileName, int format, bool redraw) { std::string name = fileName; @@ -510,66 +524,93 @@ void CreateOutputFile(const std::string &fileName, int format, bool redraw) #if defined(HAVE_MPEG_ENCODE) case FORMAT_MPEG: + case FORMAT_MPEG_PREVIEW: { std::string parFileName = CTX::instance()->homeDir + ".gmsh-mpeg_encode.par"; - FILE *fp = Fopen(parFileName.c_str(), "w"); - if(!fp){ - Msg::Error("Unable to open file '%s'", parFileName.c_str()); - error = true; - break; + FILE *fp = 0; + if(format != FORMAT_MPEG_PREVIEW){ + fp = Fopen(parFileName.c_str(), "w"); + if(!fp){ + Msg::Error("Unable to open file '%s'", parFileName.c_str()); + error = true; + break; + } + } + + int numViews = (int)opt_post_nb_views(0, GMSH_GET, 0); + int numSteps = 0; + int cycle = CTX::instance()->post.animCycle; + if(cycle == 0){ + for(int i = 0; i < numViews; i++){ + if(opt_view_visible(i, GMSH_GET, 0)) + numSteps = std::max(numSteps, + (int)opt_view_nb_non_empty_timestep(i, GMSH_GET, 0)); + } + } + else if(cycle == 1){ + numSteps = numViews; } - int numViews = (int)opt_post_nb_views(0, GMSH_GET, 0), numSteps = 0; - for(int i = 0; i < numViews; i++){ - if(opt_view_visible(i, GMSH_GET, 0)) - numSteps = std::max(numSteps, - (int)opt_view_nb_non_empty_timestep(i, GMSH_GET, 0)); + else{ + numSteps = CTX::instance()->print.parameterSteps; } + std::vector<std::string> frames; - for(int i = 0; i < (CTX::instance()->post.animCycle ? numViews : numSteps); - i += CTX::instance()->post.animStep){ + for(int i = 0; i < numSteps; i += CTX::instance()->post.animStep){ char tmp[256]; sprintf(tmp, ".gmsh-%06d.ppm", (int)frames.size()); frames.push_back(tmp); } - status_play_manual(!CTX::instance()->post.animCycle, 0, false); - for(unsigned int i = 0; i < frames.size(); i++){ - CreateOutputFile(CTX::instance()->homeDir + frames[i], FORMAT_PPM, false); - status_play_manual(!CTX::instance()->post.animCycle, - CTX::instance()->post.animStep, false); - } - int repeat = (int)(CTX::instance()->post.animDelay * 24); - if(repeat < 1) repeat = 1; - std::string pattern("I"); - // including P frames would lead to smaller files, but the quality - // degradation is perceptible: - // for(int i = 1; i < repeat; i++) pattern += "P"; - fprintf(fp, "PATTERN %s\nBASE_FILE_FORMAT PPM\nGOP_SIZE %d\n" - "SLICES_PER_FRAME 1\nPIXEL FULL\nRANGE 10\n" - "PSEARCH_ALG EXHAUSTIVE\nBSEARCH_ALG CROSS2\n" - "IQSCALE 1\nPQSCALE 1\nBQSCALE 25\nREFERENCE_FRAME DECODED\n" - "OUTPUT %s\nINPUT_CONVERT *\nINPUT_DIR %s\nINPUT\n", - pattern.c_str(), repeat, name.c_str(), - CTX::instance()->homeDir.c_str()); + if(cycle != 2) + status_play_manual(!cycle, 0, false); + else + change_print_parameter(0); for(unsigned int i = 0; i < frames.size(); i++){ - fprintf(fp, "%s", frames[i].c_str()); - if(repeat > 1) fprintf(fp, " [1-%d]", repeat); - fprintf(fp, "\n"); - } - fprintf(fp, "END_INPUT\n"); - fclose(fp); - extern int mpeg_encode_main(int, char**); - char *args[] = {(char*)"gmsh", (char*)parFileName.c_str()}; - try{ - mpeg_encode_main(2, args); - } - catch (const char *msg){ - Msg::Error("%s", msg); - error = true; + if(fp) + CreateOutputFile(CTX::instance()->homeDir + frames[i], FORMAT_PPM, false); + if(cycle != 2) + status_play_manual(!cycle, CTX::instance()->post.animStep, false); + else + change_print_parameter(i + 1); + if(!fp){ + drawContext::global()->draw(); + SleepInSeconds(CTX::instance()->post.animDelay); + } } - if(opt_print_delete_tmp_files(0, GMSH_GET, 0)){ - UnlinkFile(parFileName); - for(unsigned int i = 0; i < frames.size(); i++) - UnlinkFile(CTX::instance()->homeDir + frames[i]); + if(fp){ + int repeat = (int)(CTX::instance()->post.animDelay * 24); + if(repeat < 1) repeat = 1; + std::string pattern("I"); + // including P frames would lead to smaller files, but the quality + // degradation is perceptible: + // for(int i = 1; i < repeat; i++) pattern += "P"; + fprintf(fp, "PATTERN %s\nBASE_FILE_FORMAT PPM\nGOP_SIZE %d\n" + "SLICES_PER_FRAME 1\nPIXEL FULL\nRANGE 10\n" + "PSEARCH_ALG EXHAUSTIVE\nBSEARCH_ALG CROSS2\n" + "IQSCALE 1\nPQSCALE 1\nBQSCALE 25\nREFERENCE_FRAME DECODED\n" + "OUTPUT %s\nINPUT_CONVERT *\nINPUT_DIR %s\nINPUT\n", + pattern.c_str(), repeat, name.c_str(), + CTX::instance()->homeDir.c_str()); + for(unsigned int i = 0; i < frames.size(); i++){ + fprintf(fp, "%s", frames[i].c_str()); + if(repeat > 1) fprintf(fp, " [1-%d]", repeat); + fprintf(fp, "\n"); + } + fprintf(fp, "END_INPUT\n"); + fclose(fp); + extern int mpeg_encode_main(int, char**); + char *args[] = {(char*)"gmsh", (char*)parFileName.c_str()}; + try{ + mpeg_encode_main(2, args); + } + catch (const char *msg){ + Msg::Error("%s", msg); + error = true; + } + if(opt_print_delete_tmp_files(0, GMSH_GET, 0)){ + UnlinkFile(parFileName); + for(unsigned int i = 0; i < frames.size(); i++) + UnlinkFile(CTX::instance()->homeDir + frames[i]); + } } } break; diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h index 80bdfe212fa681ae8ec340eeed9ced8516b702d0..94b265692e232ba868b75230c62750d340cfff1c 100644 --- a/Common/DefaultOptions.h +++ b/Common/DefaultOptions.h @@ -266,6 +266,10 @@ StringXString ViewOptions_String[] = { } ; StringXString PrintOptions_String[] = { + { F|O, "ParameterCommand" , opt_print_parameter_command , + "View.Clip=1; General.Clip0D=Print.Parameter;" , + "Command parsed when the print parameter is changed" }, + { 0, 0 , 0 , "" , 0 } } ; @@ -874,7 +878,8 @@ StringXNumber MeshOptions_Number[] = { { F|O, "Binary" , opt_mesh_binary , 0. , "Write mesh files in binary format (if possible)" }, { F|O, "Bunin" , opt_mesh_bunin , 0. , - "Apply Bunin optimization on quad meshes (the parameter is the maximal size of a cavity that may be remeshed)" }, + "Apply Bunin optimization on quad meshes (the parameter is the maximal size of " + "a cavity that may be remeshed)" }, { F|O, "Lloyd" , opt_mesh_lloyd , 0. , "Apply lloyd optimization on surface meshes" }, { F|O, "SmoothCrossField" , opt_mesh_smooth_cross_field , 0. , @@ -1517,6 +1522,15 @@ StringXNumber ViewOptions_Number[] = { } ; StringXNumber PrintOptions_Number[] = { + { F|O, "Parameter" , opt_print_parameter , 0. , + "Current value of the print parameter" }, + { F|O, "ParameterFirst" , opt_print_parameter_first , -1. , + "First value of print parameter in loop" }, + { F|O, "ParameterLast" , opt_print_parameter_last , 1. , + "Last value of print parameter in loop" }, + { F|O, "ParameterSteps" , opt_print_parameter_steps , 24 , + "Number of steps in loop over print parameter" }, + { F|O, "Background" , opt_print_background , 0. , "Print background?" }, diff --git a/Common/GmshDefines.h b/Common/GmshDefines.h index 16632e84c2f095ab69f7a19f9da0eaa96105ca35..6226ccd540155cbae736be661e6933f367a91ba5 100644 --- a/Common/GmshDefines.h +++ b/Common/GmshDefines.h @@ -49,6 +49,7 @@ #define FORMAT_PLY2 40 #define FORMAT_CELUM 41 #define FORMAT_SU2 42 +#define FORMAT_MPEG_PREVIEW 43 // Element types #define TYPE_PNT 1 diff --git a/Common/Options.cpp b/Common/Options.cpp index 289e85c1edaedc32a91380e31d8a8bf0fee62c31..796e342d5de77f54effa730343c76870b7cee35b 100644 --- a/Common/Options.cpp +++ b/Common/Options.cpp @@ -1868,6 +1868,13 @@ std::string opt_view_attributes(OPT_ARGS_STR) #endif } +std::string opt_print_parameter_command(OPT_ARGS_STR) +{ + if(action & GMSH_SET) + CTX::instance()->print.parameterCommand = val; + return CTX::instance()->print.parameterCommand; +} + // Numeric option routines double opt_general_initial_context(OPT_ARGS_NUM) @@ -6213,8 +6220,12 @@ double opt_post_anim_delay(OPT_ARGS_NUM) double opt_post_anim_cycle(OPT_ARGS_NUM) { - if(action & GMSH_SET) + if(action & GMSH_SET){ CTX::instance()->post.animCycle = (int)val; + if(CTX::instance()->post.animCycle < 0 || + CTX::instance()->post.animCycle > 2) + CTX::instance()->post.animCycle = 0; + } #if defined(HAVE_FLTK) if(FlGui::available() && (action & GMSH_GUI)) FlGui::instance()->options->post.butt[0]->value @@ -8619,6 +8630,34 @@ double opt_print_width(OPT_ARGS_NUM) return CTX::instance()->print.width; } +double opt_print_parameter(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX::instance()->print.parameter = val; + return CTX::instance()->print.parameter; +} + +double opt_print_parameter_first(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX::instance()->print.parameterFirst = val; + return CTX::instance()->print.parameterFirst; +} + +double opt_print_parameter_last(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX::instance()->print.parameterLast = val; + return CTX::instance()->print.parameterLast; +} + +double opt_print_parameter_steps(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX::instance()->print.parameterSteps = val; + return CTX::instance()->print.parameterSteps; +} + // Color option routines #if defined(HAVE_FLTK) diff --git a/Common/Options.h b/Common/Options.h index 87c0dbe202da82d275de4674e7d2a4ed2a2cd91e..e2b3dd6cbd3b2769ca9ac9cc540b3db8dc69982a 100644 --- a/Common/Options.h +++ b/Common/Options.h @@ -109,6 +109,7 @@ std::string opt_view_stipple7(OPT_ARGS_STR); std::string opt_view_stipple8(OPT_ARGS_STR); std::string opt_view_stipple9(OPT_ARGS_STR); std::string opt_view_attributes(OPT_ARGS_STR); +std::string opt_print_parameter_command(OPT_ARGS_STR); // NUMBERS @@ -668,6 +669,10 @@ double opt_print_composite_windows(OPT_ARGS_NUM); double opt_print_delete_tmp_files(OPT_ARGS_NUM); double opt_print_height(OPT_ARGS_NUM); double opt_print_width(OPT_ARGS_NUM); +double opt_print_parameter(OPT_ARGS_NUM); +double opt_print_parameter_first(OPT_ARGS_NUM); +double opt_print_parameter_last(OPT_ARGS_NUM); +double opt_print_parameter_steps(OPT_ARGS_NUM); // COLORS diff --git a/Fltk/fileDialogs.cpp b/Fltk/fileDialogs.cpp index 3bf30020ffc2602f7a2c569bdbd9cf126a90c331..168816d691185cd60207cbf0a0979af238d93983 100644 --- a/Fltk/fileDialogs.cpp +++ b/Fltk/fileDialogs.cpp @@ -367,31 +367,59 @@ int mpegFileDialog(const char *name) { struct _mpegFileDialog{ Fl_Window *window; - Fl_Round_Button *b[2]; + Fl_Round_Button *b[3]; + Fl_Group *param; Fl_Check_Button *c[3]; - Fl_Value_Input *v[2]; - Fl_Button *ok, *cancel; + Fl_Input *p; + Fl_Value_Input *v[5]; + Fl_Group *buttons; + Fl_Button *ok, *preview, *cancel; }; static _mpegFileDialog *dialog = NULL; if(!dialog){ dialog = new _mpegFileDialog; - int h = 3 * WB + 8 * BH, w = 2 * BB + 3 * WB, y = WB; + int h = 4 * WB + 11 * BH, w = 3 * BB + 4 * WB, y = WB; + int ww = w - 2 * WB; dialog->window = new Fl_Double_Window(w, h, "MPEG Options"); dialog->window->box(GMSH_WINDOW_BOX); dialog->window->set_modal(); { - Fl_Group *o = new Fl_Group(WB, y, 2 * BB + WB, 2 * BH); + Fl_Group *o = new Fl_Group(WB, y, ww, 3 * BH); dialog->b[0] = new Fl_Round_Button - (WB, y, 2 * BB + WB, BH, "Cycle through time steps"); y += BH; + (WB, y, ww, BH, "Cycle through time steps"); y += BH; dialog->b[0]->type(FL_RADIO_BUTTON); dialog->b[1] = new Fl_Round_Button - (WB, y, 2 * BB + WB, BH, "Cycle through views"); y += BH; + (WB, y, ww, BH, "Cycle through views"); y += BH; dialog->b[1]->type(FL_RADIO_BUTTON); + dialog->b[2] = new Fl_Round_Button + (WB, y, ww, BH, "Loop over print parameter value"); y += BH; + dialog->b[2]->type(FL_RADIO_BUTTON); o->end(); } + + int ww2 = (2 * BB + WB) / 4; + + dialog->param = new Fl_Group(WB, y, ww, 2 * BH); + dialog->p = new Fl_Input(WB, y, ww, BH); y += BH; + dialog->p->align(FL_ALIGN_RIGHT); + + + dialog->v[2] = new Fl_Value_Input(WB, y, ww2, BH); + dialog->v[3] = new Fl_Value_Input(WB + ww2, y, ww2, BH); + dialog->v[4] = new Fl_Value_Input(WB + 2 * ww2, y, 2 * BB + WB - 3 * ww2, BH, + "First / Last / Steps"); + dialog->v[4]->align(FL_ALIGN_RIGHT); + dialog->v[4]->minimum(1); + dialog->v[4]->maximum(500); + dialog->v[4]->step(1); + y += BH; + dialog->param->end(); + + y += WB; + dialog->v[0] = new Fl_Value_Input - (WB, y, BB / 2, BH, "Frame duration (in sec.)"); y += BH; + (WB, y, ww2, BH, "Frame duration (in seconds)"); y += BH; dialog->v[0]->minimum(1. / 24.); dialog->v[0]->maximum(2.); dialog->v[0]->step(1. / 24.); @@ -399,37 +427,52 @@ int mpegFileDialog(const char *name) dialog->v[0]->align(FL_ALIGN_RIGHT); dialog->v[1] = new Fl_Value_Input - (WB, y, BB / 2, BH, "Steps between frames"); y += BH; + (WB, y, ww2, BH, "Steps between frames"); y += BH; dialog->v[1]->minimum(1); dialog->v[1]->maximum(100); dialog->v[1]->step(1); dialog->v[1]->align(FL_ALIGN_RIGHT); dialog->c[0] = new Fl_Check_Button - (WB, y, 2 * BB + WB, BH, "Print background"); y += BH; + (WB, y, ww, BH, "Print background"); y += BH; dialog->c[0]->type(FL_TOGGLE_BUTTON); dialog->c[1] = new Fl_Check_Button - (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH; + (WB, y, ww, BH, "Composite all window tiles"); y += BH; dialog->c[1]->type(FL_TOGGLE_BUTTON); dialog->c[2] = new Fl_Check_Button - (WB, y, 2 * BB + WB, BH, "Delete temporary files"); y += BH; + (WB, y, ww, BH, "Delete temporary files"); y += BH; dialog->c[2]->type(FL_TOGGLE_BUTTON); + dialog->buttons = new Fl_Group(WB, y + WB, ww, BH); dialog->ok = new Fl_Return_Button(WB, y + WB, BB, BH, "OK"); - dialog->cancel = new Fl_Button(2 * WB + BB, y + WB, BB, BH, "Cancel"); + dialog->preview = new Fl_Button(2 * WB + BB, y + WB, BB, BH, "Preview"); + dialog->cancel = new Fl_Button(3 * WB + 2 * BB, y + WB, BB, BH, "Cancel"); + dialog->buttons->end(); + dialog->window->end(); dialog->window->hotspot(dialog->window); } - dialog->b[0]->value(!CTX::instance()->post.animCycle); - dialog->b[1]->value(CTX::instance()->post.animCycle); + dialog->b[0]->value(CTX::instance()->post.animCycle == 0); + dialog->b[1]->value(CTX::instance()->post.animCycle == 1); + dialog->b[2]->value(CTX::instance()->post.animCycle == 2); dialog->v[0]->value(CTX::instance()->post.animDelay); dialog->v[1]->value(CTX::instance()->post.animStep); dialog->c[0]->value(CTX::instance()->print.background); dialog->c[1]->value(CTX::instance()->print.compositeWindows); dialog->c[2]->value(CTX::instance()->print.deleteTmpFiles); + + dialog->p->value(CTX::instance()->print.parameterCommand.c_str()); + if(dialog->b[2]->value()) + dialog->param->activate(); + else + dialog->param->deactivate(); + dialog->v[2]->value(CTX::instance()->print.parameterFirst); + dialog->v[3]->value(CTX::instance()->print.parameterLast); + dialog->v[4]->value(CTX::instance()->print.parameterSteps); + dialog->window->show(); while(dialog->window->shown()){ @@ -437,16 +480,32 @@ int mpegFileDialog(const char *name) for (;;) { Fl_Widget* o = Fl::readqueue(); if (!o) break; - if (o == dialog->ok) { - opt_post_anim_cycle(0, GMSH_SET | GMSH_GUI, (int)dialog->b[1]->value()); + if (o == dialog->b[0] || o == dialog->b[1] || o == dialog->b[2]) { + if(dialog->b[2]->value()) + dialog->param->activate(); + else + dialog->param->deactivate(); + } + if (o == dialog->ok || o == dialog->preview) { + opt_post_anim_cycle(0, GMSH_SET | GMSH_GUI, dialog->b[2]->value() ? 2 : + dialog->b[1]->value() ? 1 : 0); + opt_print_parameter_command(0, GMSH_SET | GMSH_GUI, dialog->p->value()); + opt_print_parameter_first(0, GMSH_SET | GMSH_GUI, dialog->v[2]->value()); + opt_print_parameter_last(0, GMSH_SET | GMSH_GUI, dialog->v[3]->value()); + opt_print_parameter_steps(0, GMSH_SET | GMSH_GUI, dialog->v[4]->value()); opt_post_anim_delay(0, GMSH_SET | GMSH_GUI, dialog->v[0]->value()); opt_post_anim_step(0, GMSH_SET | GMSH_GUI, (int)dialog->v[1]->value()); opt_print_background(0, GMSH_SET | GMSH_GUI, (int)dialog->c[0]->value()); opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, (int)dialog->c[1]->value()); opt_print_delete_tmp_files(0, GMSH_SET | GMSH_GUI, (int)dialog->c[2]->value()); - CreateOutputFile(name, FORMAT_MPEG); - dialog->window->hide(); - return 1; + int format = (o == dialog->preview) ? FORMAT_MPEG_PREVIEW : FORMAT_MPEG; + dialog->buttons->deactivate(); + CreateOutputFile(name, format); + dialog->buttons->activate(); + if(o == dialog->ok){ + dialog->window->hide(); + return 1; + } } if (o == dialog->window || o == dialog->cancel){ dialog->window->hide(); diff --git a/Fltk/optionWindow.cpp b/Fltk/optionWindow.cpp index 2a5f130feb652c2f75fc8e6fee52421d16f1dd43..48bc840a2c556df466aa4066cf69a566a5258654 100644 --- a/Fltk/optionWindow.cpp +++ b/Fltk/optionWindow.cpp @@ -2689,7 +2689,7 @@ optionWindow::optionWindow(int deltaFontSize) solver.input[0]->callback(solver_options_ok_cb); solver.value[0] = new Fl_Value_Input - (L + 2 * WB, 2 * WB + 2 * BH, IW, BH, "Timeout (in sec.)"); + (L + 2 * WB, 2 * WB + 2 * BH, IW, BH, "Timeout (in seconds)"); solver.value[0]->align(FL_ALIGN_RIGHT); solver.value[0]->callback(solver_options_ok_cb); @@ -2728,7 +2728,7 @@ optionWindow::optionWindow(int deltaFontSize) post.choice[0]->callback(post_options_ok_cb); post.value[0] = new Fl_Value_Input - (L + 2 * WB, 2 * WB + 2 * BH, IW, BH, "Frame duration (in sec.)"); + (L + 2 * WB, 2 * WB + 2 * BH, IW, BH, "Frame duration (in seconds)"); post.value[0]->minimum(0); post.value[0]->maximum(10); post.value[0]->step(0.01); diff --git a/doc/texinfo/gmsh.texi b/doc/texinfo/gmsh.texi index e7928c98492f3a54abf31636603d3fe13c9e38b7..8459d77b2a8ed5864257207ae13006a24dcbab24 100644 --- a/doc/texinfo/gmsh.texi +++ b/doc/texinfo/gmsh.texi @@ -1641,10 +1641,10 @@ current file. @item Draw; Redraws the scene. -@item DrawForceChanged; -Same as @code{Draw}, but force the mesh and post-processing vertex -arrays to be regenerated. Useful e.g. for creating animations with -changing clipping planes, etc. +@item SetChanged; +Force the mesh and post-processing vertex arrays to be +regenerated. Useful e.g. for creating animations with changing clipping +planes, etc. @item BoundingBox; Recomputes the bounding box of the scene (which is normally computed only diff --git a/doc/texinfo/opt_print.texi b/doc/texinfo/opt_print.texi index 48137782749d4ffcf36915184bd83e07f79e8ff2..d0d45df1b7d84a33431ad57bf060acc4116eb6a0 100644 --- a/doc/texinfo/opt_print.texi +++ b/doc/texinfo/opt_print.texi @@ -4,6 +4,31 @@ @c @ftable @code +@item Print.ParameterCommand +Command parsed when the print parameter is changed@* +Default value: @code{"View.Clip=1; General.Clip0D=Print.Parameter;"}@* +Saved in: @code{General.OptionsFileName} + +@item Print.Parameter +Current value of the print parameter@* +Default value: @code{0}@* +Saved in: @code{General.OptionsFileName} + +@item Print.ParameterFirst +First value of print parameter in loop@* +Default value: @code{-1}@* +Saved in: @code{General.OptionsFileName} + +@item Print.ParameterLast +Last value of print parameter in loop@* +Default value: @code{1}@* +Saved in: @code{General.OptionsFileName} + +@item Print.ParameterSteps +Number of steps in loop over print parameter@* +Default value: @code{24}@* +Saved in: @code{General.OptionsFileName} + @item Print.Background Print background?@* Default value: @code{0}@* diff --git a/doc/texinfo/shortcuts.texi b/doc/texinfo/shortcuts.texi index c765b63f0f0f0b5be6d91cac5bd0843b605c8398..3ee35863062d042915e47ae7a038c66c731afb81 100644 --- a/doc/texinfo/shortcuts.texi +++ b/doc/texinfo/shortcuts.texi @@ -134,8 +134,6 @@ Hide/show mesh volume faces Hide/show mesh surface faces @item Alt+Shift+l Hide/show mesh lines -@item Alt+Shift+o -Adjust projection parameters @item Alt+Shift+p Hide/show mesh points @item Alt+Shift+s