diff --git a/Common/Context.h b/Common/Context.h index ec302470af1cbc4a4f3abc06e489b510199f34d0..16385a1ecb794b3db05bf203e50f20e7c0dbda0d 100644 --- a/Common/Context.h +++ b/Common/Context.h @@ -95,10 +95,10 @@ public : float quaternion[4]; // the actual quaternion used for "trackball" rotating int useTrackball; // do or do not use the trackball for rotations double rotation_center[3]; // point around which to rotate the scene - int rotation_center_cg; // rotate around the center of gravity instead of rotation_center[] + int rotation_center_cg; // rotate around the center of mass instead of rotation_center[] double min[3]; // x, y and z min for the current geometry double max[3]; // x, y and z max for the current geometry - double cg[3]; // "center of gravity" of the current geometry + double cg[3]; // "center of mass" of the current geometry double range[3]; // maximum range in the three directions double lc, lc_middle; // characteristic lengths for the whole problem, double lc_order; // and never used in mesh generation (->only for geo/post) diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h index a7c9c4c67ea12a7d144ecc259e7054cda2f09fb3..3e5531fb2d6514e88cdf8c3c47c37e7c1b14ebb2 100644 --- a/Common/DefaultOptions.h +++ b/Common/DefaultOptions.h @@ -555,7 +555,7 @@ StringXNumber GeneralOptions_Number[] = { { F, "RotationZ" , opt_general_rotation2 , 0.0 , "Third Euler angle (used if Trackball=0)" }, { F|O, "RotationCenterGravity" , opt_general_rotation_center_cg , 1. , - "Rotate around the center of gravity instead of (RotationCenterX, RotationCenterY, RotationCenterZ)" }, + "Rotate around the (pseudo) center of mass instead of (RotationCenterX, RotationCenterY, RotationCenterZ)" }, { F, "RotationCenterX" , opt_general_rotation_center0 , 0.0 , "X coordinate of the center of rotation" }, { F, "RotationCenterY" , opt_general_rotation_center1 , 0.0 , diff --git a/Common/Options.cpp b/Common/Options.cpp index db2b0460eca2afbeef89e162532a8b55efe51219..f605cb619f9ab81a4b3c93a58619dd77618bf47c 100644 --- a/Common/Options.cpp +++ b/Common/Options.cpp @@ -1,4 +1,4 @@ -// $Id: Options.cpp,v 1.175 2004-07-23 04:47:41 geuzaine Exp $ +// $Id: Options.cpp,v 1.176 2004-07-30 12:22:01 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -4525,10 +4525,12 @@ double opt_view_grid(OPT_ARGS_NUM) GET_VIEW(0.); if(action & GMSH_SET) { v->Grid = (int)val; + if(v->Grid < 0 || v->Grid > 3) + v->Grid = 0; } #if defined(HAVE_FLTK) if(_gui_action_valid(action, num)) { - WID->view_value[26]->value(v->Grid); + WID->view_choice[8]->value(v->Grid); } #endif return v->Grid; @@ -4567,11 +4569,13 @@ double opt_view_boundary(OPT_ARGS_NUM) GET_VIEW(0.); if(action & GMSH_SET) { v->Boundary = (int)val; + if(v->Boundary < 0 || v->Boundary > 3) + v->Boundary = 0; v->Changed = 1; } #if defined(HAVE_FLTK) if(_gui_action_valid(action, num)) { - WID->view_value[11]->value(v->Boundary); + WID->view_choice[9]->value(v->Boundary); } #endif return v->Boundary; @@ -4842,10 +4846,6 @@ double opt_view_transparent_scale(OPT_ARGS_NUM) if(action & GMSH_SET) { v->TransparentScale = (int)val; } -#if defined(HAVE_FLTK) - if(_gui_action_valid(action, num)) - WID->view_butt[6]->value(v->TransparentScale); -#endif return v->TransparentScale; } diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp index ef7aa0ad88aa3d9f5e16b52dcf8f2d271e5b1733..1e10d104c83c7cde54e62f8836f28d4b52e8f7c0 100644 --- a/Fltk/Callbacks.cpp +++ b/Fltk/Callbacks.cpp @@ -1,4 +1,4 @@ -// $Id: Callbacks.cpp,v 1.259 2004-07-23 04:47:41 geuzaine Exp $ +// $Id: Callbacks.cpp,v 1.260 2004-07-30 12:22:02 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -3488,6 +3488,14 @@ void view_options_ok_cb(CALLBACK_ARGS) opt_view_range_type(i, GMSH_SET, val); } + if(force || WID->view_choice[8]->changed()) { + opt_view_grid(i, GMSH_SET, WID->view_choice[8]->value()); + } + + if(force || WID->view_choice[9]->changed()) { + opt_view_boundary(i, GMSH_SET, WID->view_choice[9]->value()); + } + // view_butts if(force || WID->view_butt[1]->changed() || @@ -3515,9 +3523,6 @@ void view_options_ok_cb(CALLBACK_ARGS) if(force || WID->view_butt[5]->changed()) opt_view_draw_strings(i, GMSH_SET, WID->view_butt[5]->value()); - if(force || WID->view_butt[6]->changed()) - opt_view_transparent_scale(i, GMSH_SET, WID->view_butt[6]->value()); - if(force || WID->view_butt[11]->changed()) opt_view_light(i, GMSH_SET, WID->view_butt[11]->value()); @@ -3604,9 +3609,6 @@ void view_options_ok_cb(CALLBACK_ARGS) if(force || WID->view_value[62]->changed()) opt_view_line_width(i, GMSH_SET, WID->view_value[62]->value()); - if(force || WID->view_value[11]->changed()) - opt_view_boundary(i, GMSH_SET, WID->view_value[11]->value()); - if(force || WID->view_value[12]->changed()) opt_view_explode(i, GMSH_SET, WID->view_value[12]->value()); @@ -3629,9 +3631,6 @@ void view_options_ok_cb(CALLBACK_ARGS) if(force || WID->view_value[25]->changed()) opt_view_nb_abscissa(i, GMSH_SET, WID->view_value[25]->value()); - if(force || WID->view_value[26]->changed()) - opt_view_grid(i, GMSH_SET, WID->view_value[26]->value()); - // view_inputs if(force || WID->view_input[0]->changed()) diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp index f795535accf95e2ec8de09272230b8d6a86a2ead..2efa890a13ebc284ba1b2cdf5d9c1bcac40edc61 100644 --- a/Fltk/GUI.cpp +++ b/Fltk/GUI.cpp @@ -1,4 +1,4 @@ -// $Id: GUI.cpp,v 1.328 2004-07-23 04:47:41 geuzaine Exp $ +// $Id: GUI.cpp,v 1.329 2004-07-30 12:22:02 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -711,7 +711,7 @@ GUI::GUI(int argc, char **argv) // store fontsize now: we don't want any subsequent change // (e.g. when doing a 'restore options') to be taken into account - // the dynamic GUI features (set_context, plugin, etc.) + // in the dynamic GUI features (set_context, plugin, etc.) fontsize = CTX.fontsize; // set default font size @@ -1412,7 +1412,6 @@ void GUI::check_rotation_center_button() void GUI::create_option_window() { - int i; int width = 41 * fontsize; int height = 12 * BH + 5 * WB; int BROWSERW = 105 + WB; @@ -1458,7 +1457,7 @@ void GUI::create_option_window() { Fl_Tabs *o = new Fl_Tabs(WB, WB, width - 2 * WB, height - 2 * WB); { - Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Display"); + Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "General"); gen_butt[13] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW, BH, "Show tooltips"); gen_butt[13]->type(FL_TOGGLE_BUTTON); @@ -1467,22 +1466,44 @@ void GUI::create_option_window() gen_butt[0] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW, BH, "Show moving axes"); gen_butt[0]->tooltip("(Alt+Shift+a)"); + gen_butt[0]->type(FL_TOGGLE_BUTTON); + gen_butt[0]->down_box(TOGGLE_BOX); + gen_butt[0]->selection_color(TOGGLE_COLOR); + gen_butt[1] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW, BH, "Show small axes"); gen_butt[1]->tooltip("(Alt+a)"); + gen_butt[1]->type(FL_TOGGLE_BUTTON); + gen_butt[1]->down_box(TOGGLE_BOX); + gen_butt[1]->selection_color(TOGGLE_COLOR); + gen_butt[6] = new Fl_Check_Button(2 * WB, 2 * WB + 4 * BH, BW, BH, "Show bounding boxes"); gen_butt[6]->tooltip("(Alt+b)"); + gen_butt[6]->type(FL_TOGGLE_BUTTON); + gen_butt[6]->down_box(TOGGLE_BOX); + gen_butt[6]->selection_color(TOGGLE_COLOR); + gen_butt[2] = new Fl_Check_Button(2 * WB, 2 * WB + 5 * BH, BW, BH, "Draw simplified model while rotating, panning and zooming"); gen_butt[2]->tooltip("(Alt+f)"); + gen_butt[2]->type(FL_TOGGLE_BUTTON); + gen_butt[2]->down_box(TOGGLE_BOX); + gen_butt[2]->selection_color(TOGGLE_COLOR); + gen_butt[3] = new Fl_Check_Button(2 * WB, 2 * WB + 6 * BH, BW, BH, "Enable double buffering"); + gen_butt[3]->type(FL_TOGGLE_BUTTON); + gen_butt[3]->down_box(TOGGLE_BOX); + gen_butt[3]->selection_color(TOGGLE_COLOR); + gen_butt[4] = new Fl_Check_Button(2 * WB, 2 * WB + 7 * BH, BW, BH, "Use fake transparency mode"); + gen_butt[4]->type(FL_TOGGLE_BUTTON); + gen_butt[4]->down_box(TOGGLE_BOX); + gen_butt[4]->selection_color(TOGGLE_COLOR); + gen_butt[5] = new Fl_Check_Button(2 * WB, 2 * WB + 8 * BH, BW, BH, "Use trackball rotation mode instead of Euler angles"); - for(i = 0; i <= 6; i++) { - gen_butt[i]->type(FL_TOGGLE_BUTTON); - gen_butt[i]->down_box(TOGGLE_BOX); - gen_butt[i]->selection_color(TOGGLE_COLOR); - } + gen_butt[5]->type(FL_TOGGLE_BUTTON); + gen_butt[5]->down_box(TOGGLE_BOX); + gen_butt[5]->selection_color(TOGGLE_COLOR); - gen_butt[15] = new Fl_Check_Button(2 * WB, 2 * WB + 9 * BH, BW, BH, "Rotate around pseudo center of gravity"); + gen_butt[15] = new Fl_Check_Button(2 * WB, 2 * WB + 9 * BH, BW, BH, "Rotate around pseudo center of mass"); gen_butt[15]->type(FL_TOGGLE_BUTTON); gen_butt[15]->down_box(TOGGLE_BOX); gen_butt[15]->selection_color(TOGGLE_COLOR); @@ -1501,13 +1522,19 @@ void GUI::create_option_window() { Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Output"); gen_butt[7] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW, BH, "Print messages on terminal"); + gen_butt[7]->type(FL_TOGGLE_BUTTON); + gen_butt[7]->down_box(TOGGLE_BOX); + gen_butt[7]->selection_color(TOGGLE_COLOR); + gen_butt[8] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW, BH, "Save session information on exit"); + gen_butt[8]->type(FL_TOGGLE_BUTTON); + gen_butt[8]->down_box(TOGGLE_BOX); + gen_butt[8]->selection_color(TOGGLE_COLOR); + gen_butt[9] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW/2-WB, BH, "Save options on exit"); - for(i = 7; i < 10; i++) { - gen_butt[i]->type(FL_TOGGLE_BUTTON); - gen_butt[i]->down_box(TOGGLE_BOX); - gen_butt[i]->selection_color(TOGGLE_COLOR); - } + gen_butt[9]->type(FL_TOGGLE_BUTTON); + gen_butt[9]->down_box(TOGGLE_BOX); + gen_butt[9]->selection_color(TOGGLE_COLOR); Fl_Button *b0 = new Fl_Button(width / 2, 2 * WB + 3 * BH, 2 * BB, BH, "Restore default options"); b0->callback(options_restore_defaults_cb); @@ -1522,6 +1549,7 @@ void GUI::create_option_window() gen_value[5]->maximum(10); gen_value[5]->step(1); gen_value[5]->align(FL_ALIGN_RIGHT); + gen_input[0] = new Fl_Input(2 * WB, 2 * WB + 6 * BH, IW, BH, "Default file name"); gen_input[0]->align(FL_ALIGN_RIGHT); @@ -1529,11 +1557,13 @@ void GUI::create_option_window() } { Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Helpers"); + gen_input[1] = new Fl_Input(2 * WB, 2 * WB + 1 * BH, IW, BH, "Text editor command"); + gen_input[1]->align(FL_ALIGN_RIGHT); + gen_input[2] = new Fl_Input(2 * WB, 2 * WB + 2 * BH, IW, BH, "Web browser command"); - for(i = 1; i <= 2; i++) { - gen_input[i]->align(FL_ALIGN_RIGHT); - } + gen_input[2]->align(FL_ALIGN_RIGHT); + o->end(); } { @@ -1550,43 +1580,23 @@ void GUI::create_option_window() gen_choice[2]->align(FL_ALIGN_RIGHT); gen_choice[2]->tooltip("(Alt+o)"); - gen_value[2] = new Fl_Value_Input(2 * WB, 2 * WB + 2 * BH, IW/3, BH); - gen_value[2]->minimum(-1); - gen_value[2]->maximum(1); - gen_value[2]->step(0.01); - gen_value[3] = new Fl_Value_Input(2 * WB + IW / 3, 2 * WB + 2 * BH, IW/3, BH); - gen_value[3]->minimum(-1); - gen_value[3]->maximum(1); - gen_value[3]->step(0.01); - gen_value[4] = new Fl_Value_Input(2 * WB + 2 * IW / 3, 2 * WB + 2 * BH, IW/3, BH, "Light position"); - gen_value[4]->minimum(-1); - gen_value[4]->maximum(1); - gen_value[4]->step(0.01); - gen_value[4]->align(FL_ALIGN_RIGHT); - - gen_value[1] = new Fl_Value_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "Material shininess"); - gen_value[1]->minimum(0); - gen_value[1]->maximum(10); - gen_value[1]->step(0.1); - gen_value[1]->align(FL_ALIGN_RIGHT); - - gen_value[11] = new Fl_Value_Input(2 * WB, 2 * WB + 4 * BH, IW, BH, "Quadric subdivisions"); + gen_value[11] = new Fl_Value_Input(2 * WB, 2 * WB + 2 * BH, IW, BH, "Number of quadric subdivisions"); gen_value[11]->minimum(3); gen_value[11]->maximum(30); gen_value[11]->step(1); gen_value[11]->align(FL_ALIGN_RIGHT); - gen_value[6] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW, BH, "Point size"); + gen_value[6] = new Fl_Value_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "Point size"); gen_value[6]->minimum(0.1); gen_value[6]->maximum(50); gen_value[6]->step(0.1); - gen_value[7] = new Fl_Value_Input(2 * WB, 2 * WB + 6 * BH, IW, BH, "Line width"); + gen_value[6]->align(FL_ALIGN_RIGHT); + + gen_value[7] = new Fl_Value_Input(2 * WB, 2 * WB + 4 * BH, IW, BH, "Line width"); gen_value[7]->minimum(0.1); gen_value[7]->maximum(50); gen_value[7]->step(0.1); - for(i = 6; i <= 7; i++) { - gen_value[i]->align(FL_ALIGN_RIGHT); - } + gen_value[7]->align(FL_ALIGN_RIGHT); static Fl_Menu_Item menu_genvectype[] = { {"Line", 0, 0, 0}, @@ -1595,18 +1605,18 @@ void GUI::create_option_window() {"3D arrow", 0, 0, 0}, {0} }; - gen_choice[0] = new Fl_Choice(2 * WB, 2 * WB + 7 * BH, IW, BH, "Vector display"); + gen_choice[0] = new Fl_Choice(2 * WB, 2 * WB + 5 * BH, IW, BH, "Vector display"); gen_choice[0]->menu(menu_genvectype); gen_choice[0]->align(FL_ALIGN_RIGHT); - Fl_Button *b = new Fl_Button(2 * IW - 2 * WB, 2 * WB + 7 * BH, (int)(1.5*BB), BH, "Edit arrow shape"); + Fl_Button *b = new Fl_Button(2 * IW - 2 * WB, 2 * WB + 5 * BH, (int)(1.5*BB), BH, "Edit arrow shape"); b->callback(general_arrow_param_cb); - gen_choice[1] = new Fl_Choice(2 * WB, 2 * WB + 8 * BH, IW, BH, "Font"); + gen_choice[1] = new Fl_Choice(2 * WB, 2 * WB + 6 * BH, IW, BH, "Font"); gen_choice[1]->menu(menu_font_names); gen_choice[1]->align(FL_ALIGN_RIGHT); - gen_value[12] = new Fl_Value_Input(2 * WB, 2 * WB + 9 * BH, IW, BH, "Font size"); + gen_value[12] = new Fl_Value_Input(2 * WB, 2 * WB + 7 * BH, IW, BH, "Font size"); gen_value[12]->minimum(5); gen_value[12]->maximum(40); gen_value[12]->step(1); @@ -1615,7 +1625,35 @@ void GUI::create_option_window() o->end(); } { - Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Colors"); + Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Light"); + o->hide(); + + gen_value[2] = new Fl_Value_Input(2 * WB, 2 * WB + 1 * BH, IW/3, BH); + gen_value[2]->minimum(-1); + gen_value[2]->maximum(1); + gen_value[2]->step(0.01); + + gen_value[3] = new Fl_Value_Input(2 * WB + IW / 3, 2 * WB + 1 * BH, IW/3, BH); + gen_value[3]->minimum(-1); + gen_value[3]->maximum(1); + gen_value[3]->step(0.01); + + gen_value[4] = new Fl_Value_Input(2 * WB + 2 * IW / 3, 2 * WB + 1 * BH, IW/3, BH, "Light position"); + gen_value[4]->minimum(-1); + gen_value[4]->maximum(1); + gen_value[4]->step(0.01); + gen_value[4]->align(FL_ALIGN_RIGHT); + + gen_value[1] = new Fl_Value_Input(2 * WB, 2 * WB + 2 * BH, IW, BH, "Material shininess"); + gen_value[1]->minimum(0); + gen_value[1]->maximum(10); + gen_value[1]->step(0.1); + gen_value[1]->align(FL_ALIGN_RIGHT); + + o->end(); + } + { + Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Color"); o->hide(); static Fl_Menu_Item menu_color_scheme[] = { @@ -1632,13 +1670,14 @@ void GUI::create_option_window() gen_choice[3]->tooltip("(Alt+c)"); Fl_Scroll *s = new Fl_Scroll(2 * WB, 3 * WB + 2 * BH, IW + 20, height - 5 * WB - 2 * BH); - i = 0; + int i = 0; while(GeneralOptions_Color[i].str) { gen_col[i] = new Fl_Button(2 * WB, 3 * WB + (2 + i) * BH, IW, BH, GeneralOptions_Color[i].str); gen_col[i]->callback(color_cb, (void *)GeneralOptions_Color[i].function); i++; } s->end(); + o->end(); } o->end(); @@ -1654,97 +1693,137 @@ void GUI::create_option_window() { Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "General"); o->hide(); - geo_butt[8] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW, BH, "Auto coherence (suppress duplicate entities)"); + geo_butt[8] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW, BH, "Remove duplicate entities automatically"); geo_butt[8]->type(FL_TOGGLE_BUTTON); geo_butt[8]->down_box(TOGGLE_BOX); geo_butt[8]->selection_color(TOGGLE_COLOR); + o->end(); } { Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Visibility"); + geo_butt[0] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Points"); geo_butt[0]->tooltip("(Alt+p)"); + geo_butt[0]->type(FL_TOGGLE_BUTTON); + geo_butt[0]->down_box(TOGGLE_BOX); + geo_butt[0]->selection_color(TOGGLE_COLOR); + geo_butt[1] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Lines"); geo_butt[1]->tooltip("(Alt+l)"); + geo_butt[1]->type(FL_TOGGLE_BUTTON); + geo_butt[1]->down_box(TOGGLE_BOX); + geo_butt[1]->selection_color(TOGGLE_COLOR); + geo_butt[2] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Surfaces"); geo_butt[2]->tooltip("(Alt+s)"); + geo_butt[2]->type(FL_TOGGLE_BUTTON); + geo_butt[2]->down_box(TOGGLE_BOX); + geo_butt[2]->selection_color(TOGGLE_COLOR); + geo_butt[3] = new Fl_Check_Button(2 * WB, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Volumes"); geo_butt[3]->tooltip("(Alt+v)"); + geo_butt[3]->type(FL_TOGGLE_BUTTON); + geo_butt[3]->down_box(TOGGLE_BOX); + geo_butt[3]->selection_color(TOGGLE_COLOR); + geo_butt[4] = new Fl_Check_Button(width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Point numbers"); + geo_butt[4]->type(FL_TOGGLE_BUTTON); + geo_butt[4]->down_box(TOGGLE_BOX); + geo_butt[4]->selection_color(TOGGLE_COLOR); + geo_butt[5] = new Fl_Check_Button(width / 2, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Line numbers"); + geo_butt[5]->type(FL_TOGGLE_BUTTON); + geo_butt[5]->down_box(TOGGLE_BOX); + geo_butt[5]->selection_color(TOGGLE_COLOR); + geo_butt[6] = new Fl_Check_Button(width / 2, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Surface numbers"); + geo_butt[6]->type(FL_TOGGLE_BUTTON); + geo_butt[6]->down_box(TOGGLE_BOX); + geo_butt[6]->selection_color(TOGGLE_COLOR); + geo_butt[7] = new Fl_Check_Button(width / 2, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Volume numbers"); - for(i = 0; i < 8; i++) { - geo_butt[i]->type(FL_TOGGLE_BUTTON); - geo_butt[i]->down_box(TOGGLE_BOX); - geo_butt[i]->selection_color(TOGGLE_COLOR); - } + geo_butt[7]->type(FL_TOGGLE_BUTTON); + geo_butt[7]->down_box(TOGGLE_BOX); + geo_butt[7]->selection_color(TOGGLE_COLOR); geo_value[0] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW, BH, "Normals"); + geo_value[0]->minimum(0); + geo_value[0]->maximum(500); + geo_value[0]->step(1); + geo_value[0]->align(FL_ALIGN_RIGHT); + geo_value[1] = new Fl_Value_Input(2 * WB, 2 * WB + 6 * BH, IW, BH, "Tangents"); - for(i = 0; i < 2; i++) { - geo_value[i]->minimum(0); - geo_value[i]->maximum(500); - geo_value[i]->step(1); - geo_value[i]->align(FL_ALIGN_RIGHT); - } + geo_value[1]->minimum(0); + geo_value[1]->maximum(500); + geo_value[1]->step(1); + geo_value[1]->align(FL_ALIGN_RIGHT); + o->end(); } { Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Aspect"); o->hide(); - geo_butt[9] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW, BH, "Enable lighting"); - geo_butt[9]->type(FL_TOGGLE_BUTTON); - geo_butt[9]->down_box(TOGGLE_BOX); - geo_butt[9]->selection_color(TOGGLE_COLOR); - geo_butt[9]->tooltip("(Alt+w)"); - - geo_choice[0] = new Fl_Choice(2 * WB, 2 * WB + 2 * BH, IW, BH, "Point display"); + geo_choice[0] = new Fl_Choice(2 * WB, 2 * WB + 1 * BH, IW, BH, "Point display"); geo_choice[0]->menu(menu_point_display); geo_choice[0]->align(FL_ALIGN_RIGHT); - geo_value[3] = new Fl_Value_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "Point size"); + geo_value[3] = new Fl_Value_Input(2 * WB, 2 * WB + 2 * BH, IW, BH, "Point size"); geo_value[3]->minimum(0.1); geo_value[3]->maximum(50); geo_value[3]->step(0.1); + geo_value[3]->align(FL_ALIGN_RIGHT); - geo_value[5] = new Fl_Value_Input(2 * WB, 2 * WB + 4 * BH, IW, BH, "Selected point size"); + geo_value[5] = new Fl_Value_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "Selected point size"); geo_value[5]->minimum(0.1); geo_value[5]->maximum(50); geo_value[5]->step(0.1); + geo_value[5]->align(FL_ALIGN_RIGHT); - geo_choice[1] = new Fl_Choice(2 * WB, 2 * WB + 5 * BH, IW, BH, "Line display"); + geo_choice[1] = new Fl_Choice(2 * WB, 2 * WB + 4 * BH, IW, BH, "Line display"); geo_choice[1]->menu(menu_line_display); geo_choice[1]->align(FL_ALIGN_RIGHT); - geo_value[4] = new Fl_Value_Input(2 * WB, 2 * WB + 6 * BH, IW, BH, "Line width"); + geo_value[4] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW, BH, "Line width"); geo_value[4]->minimum(0.1); geo_value[4]->maximum(50); geo_value[4]->step(0.1); + geo_value[4]->align(FL_ALIGN_RIGHT); - geo_value[6] = new Fl_Value_Input(2 * WB, 2 * WB + 7 * BH, IW, BH, "Selected line width"); + geo_value[6] = new Fl_Value_Input(2 * WB, 2 * WB + 6 * BH, IW, BH, "Selected line width"); geo_value[6]->minimum(0.1); geo_value[6]->maximum(50); geo_value[6]->step(0.1); + geo_value[6]->align(FL_ALIGN_RIGHT); - for(i = 3; i <= 6; i++) { - geo_value[i]->align(FL_ALIGN_RIGHT); - } o->end(); } { - Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Colors"); + Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Light"); + o->hide(); + + geo_butt[9] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW, BH, "Enable lighting"); + geo_butt[9]->type(FL_TOGGLE_BUTTON); + geo_butt[9]->down_box(TOGGLE_BOX); + geo_butt[9]->selection_color(TOGGLE_COLOR); + geo_butt[9]->tooltip("(Alt+w)"); + + o->end(); + } + { + Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Color"); o->hide(); Fl_Scroll *s = new Fl_Scroll(2 * WB, 2 * WB + 1 * BH, IW + 20, height - 4 * WB - 1 * BH); - i = 0; + int i = 0; while(GeometryOptions_Color[i].str) { geo_col[i] = new Fl_Button(2 * WB, 2 * WB + (1 + i) * BH, IW, BH, GeometryOptions_Color[i].str); geo_col[i]->callback(color_cb, (void *)GeometryOptions_Color[i].function); i++; } s->end(); + o->end(); } o->end(); @@ -1790,21 +1869,25 @@ void GUI::create_option_window() mesh_value[0]->minimum(0); mesh_value[0]->maximum(100); mesh_value[0]->step(1); + mesh_value[0]->align(FL_ALIGN_RIGHT); + mesh_value[1] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW, BH, "Mesh scaling factor"); mesh_value[1]->minimum(0.001); mesh_value[1]->maximum(1000); mesh_value[1]->step(0.001); + mesh_value[1]->align(FL_ALIGN_RIGHT); + mesh_value[2] = new Fl_Value_Input(2 * WB, 2 * WB + 6 * BH, IW, BH, "Characteristic length factor"); mesh_value[2]->minimum(0.001); mesh_value[2]->maximum(1000); mesh_value[2]->step(0.001); + mesh_value[2]->align(FL_ALIGN_RIGHT); + mesh_value[3] = new Fl_Value_Input(2 * WB, 2 * WB + 7 * BH, IW, BH, "Random perturbation factor"); mesh_value[3]->minimum(1.e-6); mesh_value[3]->maximum(1.e-1); mesh_value[3]->step(1.e-6); - for(i = 0; i < 4; i++) { - mesh_value[i]->align(FL_ALIGN_RIGHT); - } + mesh_value[3]->align(FL_ALIGN_RIGHT); mesh_butt[2] = new Fl_Check_Button(2 * WB, 2 * WB + 8 * BH, BW, BH, "Optimize quality of tetrahedral elements"); mesh_butt[2]->type(FL_TOGGLE_BUTTON); @@ -1828,46 +1911,86 @@ void GUI::create_option_window() } { Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Visibility"); + mesh_butt[6] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Nodes"); mesh_butt[6]->tooltip("(Alt+Shift+p)"); + mesh_butt[6]->type(FL_TOGGLE_BUTTON); + mesh_butt[6]->down_box(TOGGLE_BOX); + mesh_butt[6]->selection_color(TOGGLE_COLOR); + mesh_butt[7] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Line elements"); mesh_butt[7]->tooltip("(Alt+Shift+l)"); + mesh_butt[7]->type(FL_TOGGLE_BUTTON); + mesh_butt[7]->down_box(TOGGLE_BOX); + mesh_butt[7]->selection_color(TOGGLE_COLOR); + mesh_butt[8] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Surface element edges"); mesh_butt[8]->tooltip("(Alt+Shift+s)"); + mesh_butt[8]->type(FL_TOGGLE_BUTTON); + mesh_butt[8]->down_box(TOGGLE_BOX); + mesh_butt[8]->selection_color(TOGGLE_COLOR); + mesh_butt[9] = new Fl_Check_Button(2 * WB, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Surface element faces"); mesh_butt[9]->tooltip("(Alt+Shift+s, Alt+Shift+d)"); + mesh_butt[9]->type(FL_TOGGLE_BUTTON); + mesh_butt[9]->down_box(TOGGLE_BOX); + mesh_butt[9]->selection_color(TOGGLE_COLOR); + mesh_butt[10] = new Fl_Check_Button(2 * WB, 2 * WB + 5 * BH, BW / 2 - WB, BH, "Volume element edges"); mesh_butt[10]->tooltip("(Alt+Shift+v)"); + mesh_butt[10]->type(FL_TOGGLE_BUTTON); + mesh_butt[10]->down_box(TOGGLE_BOX); + mesh_butt[10]->selection_color(TOGGLE_COLOR); + mesh_butt[11] = new Fl_Check_Button(2 * WB, 2 * WB + 6 * BH, BW / 2 - WB, BH, "Volume element faces"); mesh_butt[11]->tooltip("(Alt+Shift+v)"); + mesh_butt[11]->type(FL_TOGGLE_BUTTON); + mesh_butt[11]->down_box(TOGGLE_BOX); + mesh_butt[11]->selection_color(TOGGLE_COLOR); + mesh_butt[12] = new Fl_Check_Button(width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Node numbers"); + mesh_butt[12]->type(FL_TOGGLE_BUTTON); + mesh_butt[12]->down_box(TOGGLE_BOX); + mesh_butt[12]->selection_color(TOGGLE_COLOR); + mesh_butt[13] = new Fl_Check_Button(width / 2, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Line element numbers"); + mesh_butt[13]->type(FL_TOGGLE_BUTTON); + mesh_butt[13]->down_box(TOGGLE_BOX); + mesh_butt[13]->selection_color(TOGGLE_COLOR); + mesh_butt[14] = new Fl_Check_Button(width / 2, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Surface element numbers"); + mesh_butt[14]->type(FL_TOGGLE_BUTTON); + mesh_butt[14]->down_box(TOGGLE_BOX); + mesh_butt[14]->selection_color(TOGGLE_COLOR); + mesh_butt[15] = new Fl_Check_Button(width / 2, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Volume element numbers"); - for(i = 6; i < 16; i++) { - mesh_butt[i]->type(FL_TOGGLE_BUTTON); - mesh_butt[i]->down_box(TOGGLE_BOX); - mesh_butt[i]->selection_color(TOGGLE_COLOR); - } + mesh_butt[15]->type(FL_TOGGLE_BUTTON); + mesh_butt[15]->down_box(TOGGLE_BOX); + mesh_butt[15]->selection_color(TOGGLE_COLOR); + mesh_value[4] = new Fl_Value_Input(2 * WB, 2 * WB + 7 * BH, IW / 2, BH); mesh_value[4]->minimum(0); mesh_value[4]->maximum(1); mesh_value[4]->step(0.001); - mesh_value[5] = new Fl_Value_Input(2 * WB + IW / 2, 2 * WB + 7 * BH, IW / 2, BH, "Quality range"); + mesh_value[4]->align(FL_ALIGN_RIGHT); + + mesh_value[5] = new Fl_Value_Input(2 * WB + IW / 2, 2 * WB + 7 * BH, IW / 2, BH, "Tetrahedra quality range"); mesh_value[5]->minimum(0); mesh_value[5]->maximum(1); mesh_value[5]->step(0.001); + mesh_value[5]->align(FL_ALIGN_RIGHT); mesh_value[6] = new Fl_Value_Input(2 * WB, 2 * WB + 8 * BH, IW / 2, BH); - mesh_value[7] = new Fl_Value_Input(2 * WB + IW / 2, 2 * WB + 8 * BH, IW / 2, BH, "Size range"); + mesh_value[6]->align(FL_ALIGN_RIGHT); + + mesh_value[7] = new Fl_Value_Input(2 * WB + IW / 2, 2 * WB + 8 * BH, IW / 2, BH, "Tetrahedra size range"); + mesh_value[7]->align(FL_ALIGN_RIGHT); mesh_value[8] = new Fl_Value_Input(2 * WB, 2 * WB + 9 * BH, IW, BH, "Normals"); mesh_value[8]->minimum(0); mesh_value[8]->maximum(500); mesh_value[8]->step(1); - for(i = 4; i < 9; i++) { - mesh_value[i]->align(FL_ALIGN_RIGHT); - } + mesh_value[8]->align(FL_ALIGN_RIGHT); mesh_value[13] = new Fl_Value_Input(2 * WB, 2 * WB + 10 * BH, IW, BH, "Tangents"); mesh_value[13]->minimum(0); @@ -1880,27 +2003,45 @@ void GUI::create_option_window() { Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Cut plane"); o->hide(); + mesh_butt[16] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW, BH, "Enable"); mesh_butt[16]->type(FL_TOGGLE_BUTTON); mesh_butt[16]->down_box(TOGGLE_BOX); mesh_butt[16]->selection_color(TOGGLE_COLOR); mesh_value[14] = new Fl_Value_Input(2 * WB, 2 * WB + 2 * BH, IW, BH, "A"); + mesh_value[14]->align(FL_ALIGN_RIGHT); + mesh_value[14]->callback(mesh_cut_plane_cb); + mesh_value[14]->step(0.01); + mesh_value[14]->minimum(-1.0); + mesh_value[14]->maximum(1.0); + mesh_value[15] = new Fl_Value_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "B"); + mesh_value[15]->align(FL_ALIGN_RIGHT); + mesh_value[15]->callback(mesh_cut_plane_cb); + mesh_value[15]->step(0.01); + mesh_value[15]->minimum(-1.0); + mesh_value[15]->maximum(1.0); + mesh_value[16] = new Fl_Value_Input(2 * WB, 2 * WB + 4 * BH, IW, BH, "C"); + mesh_value[16]->align(FL_ALIGN_RIGHT); + mesh_value[16]->callback(mesh_cut_plane_cb); + mesh_value[16]->step(0.01); + mesh_value[16]->minimum(-1.0); + mesh_value[16]->maximum(1.0); + mesh_value[17] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW, BH, "D"); - for(i = 14; i <= 17; i++) { - mesh_value[i]->align(FL_ALIGN_RIGHT); - mesh_value[i]->callback(mesh_cut_plane_cb); - mesh_value[i]->step(0.01); - mesh_value[i]->minimum(-1.0); - mesh_value[i]->maximum(1.0); - } + mesh_value[17]->align(FL_ALIGN_RIGHT); + mesh_value[17]->callback(mesh_cut_plane_cb); + mesh_value[17]->step(0.01); + mesh_value[17]->minimum(-1.0); + mesh_value[17]->maximum(1.0); mesh_butt[22] = new Fl_Check_Button(2 * WB, 2 * WB + 6 * BH, BW, BH, "Draw intersecting volume layer as surface"); mesh_butt[22]->type(FL_TOGGLE_BUTTON); mesh_butt[22]->down_box(TOGGLE_BOX); mesh_butt[22]->selection_color(TOGGLE_COLOR); + mesh_butt[23] = new Fl_Check_Button(2 * WB, 2 * WB + 7 * BH, BW, BH, "Cut only volume elements"); mesh_butt[23]->type(FL_TOGGLE_BUTTON); mesh_butt[23]->down_box(TOGGLE_BOX); @@ -1911,51 +2052,66 @@ void GUI::create_option_window() { Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Aspect"); o->hide(); - mesh_butt[17] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW, BH, "Enable lighting"); - mesh_butt[17]->tooltip("(Alt+w)"); - mesh_butt[18] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW, BH, "Use two-side lighting"); - mesh_butt[19] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW, BH, "Smooth normals"); - for(i = 17; i <= 19; i++) { - mesh_butt[i]->type(FL_TOGGLE_BUTTON); - mesh_butt[i]->down_box(TOGGLE_BOX); - mesh_butt[i]->selection_color(TOGGLE_COLOR); - } - - mesh_value[18] = new Fl_Value_Input(2 * WB, 2 * WB + 4 * BH, IW, BH, "Angle"); - mesh_value[18]->minimum(0.); - mesh_value[18]->maximum(180.); - mesh_value[18]->step(1.); - mesh_value[18]->align(FL_ALIGN_RIGHT); - mesh_value[9] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW, BH, "Explode elements"); + mesh_value[9] = new Fl_Value_Input(2 * WB, 2 * WB + 1 * BH, IW, BH, "Explosion factor"); mesh_value[9]->minimum(0); mesh_value[9]->maximum(1); mesh_value[9]->step(0.01); - mesh_value[10] = new Fl_Value_Input(2 * WB, 2 * WB + 7 * BH, IW, BH, "Point size"); + mesh_value[9]->align(FL_ALIGN_RIGHT); + + mesh_choice[0] = new Fl_Choice(2 * WB, 2 * WB + 2 * BH, IW, BH, "Point display"); + mesh_choice[0]->menu(menu_point_display); + mesh_choice[0]->align(FL_ALIGN_RIGHT); + + mesh_value[10] = new Fl_Value_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "Point size"); mesh_value[10]->minimum(0.1); mesh_value[10]->maximum(50); mesh_value[10]->step(0.1); - mesh_value[11] = new Fl_Value_Input(2 * WB, 2 * WB + 9 * BH, IW, BH, "Line width"); + mesh_value[10]->align(FL_ALIGN_RIGHT); + + mesh_choice[1] = new Fl_Choice(2 * WB, 2 * WB + 4 * BH, IW, BH, "Line display"); + mesh_choice[1]->menu(menu_line_display); + mesh_choice[1]->align(FL_ALIGN_RIGHT); + mesh_choice[1]->deactivate(); // don't give false hopes, as it's not used anywhere right now + + mesh_value[11] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW, BH, "Line width"); mesh_value[11]->minimum(0.1); mesh_value[11]->maximum(50); mesh_value[11]->step(0.1); - for(i = 9; i <= 11; i++) { - mesh_value[i]->align(FL_ALIGN_RIGHT); - } + mesh_value[11]->align(FL_ALIGN_RIGHT); - mesh_choice[0] = new Fl_Choice(2 * WB, 2 * WB + 6 * BH, IW, BH, "Point display"); - mesh_choice[0]->menu(menu_point_display); - mesh_choice[0]->align(FL_ALIGN_RIGHT); + o->end(); + } + { + Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Light"); + o->hide(); - mesh_choice[1] = new Fl_Choice(2 * WB, 2 * WB + 8 * BH, IW, BH, "Line display"); - mesh_choice[1]->menu(menu_line_display); - mesh_choice[1]->align(FL_ALIGN_RIGHT); - mesh_choice[1]->deactivate(); // don't give false hopes, as it's not used anywhere right now + mesh_butt[17] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW, BH, "Enable lighting"); + mesh_butt[17]->tooltip("(Alt+w)"); + mesh_butt[17]->type(FL_TOGGLE_BUTTON); + mesh_butt[17]->down_box(TOGGLE_BOX); + mesh_butt[17]->selection_color(TOGGLE_COLOR); + + mesh_butt[18] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW, BH, "Use two-side lighting"); + mesh_butt[18]->type(FL_TOGGLE_BUTTON); + mesh_butt[18]->down_box(TOGGLE_BOX); + mesh_butt[18]->selection_color(TOGGLE_COLOR); + + mesh_butt[19] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW, BH, "Smooth normals"); + mesh_butt[19]->type(FL_TOGGLE_BUTTON); + mesh_butt[19]->down_box(TOGGLE_BOX); + mesh_butt[19]->selection_color(TOGGLE_COLOR); + + mesh_value[18] = new Fl_Value_Input(2 * WB, 2 * WB + 4 * BH, IW, BH, "Smoothing threshold angle"); + mesh_value[18]->minimum(0.); + mesh_value[18]->maximum(180.); + mesh_value[18]->step(1.); + mesh_value[18]->align(FL_ALIGN_RIGHT); o->end(); } { - Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Colors"); + Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Color"); o->hide(); static Fl_Menu_Item menu_mesh_color[] = { @@ -1970,13 +2126,14 @@ void GUI::create_option_window() mesh_choice[4]->align(FL_ALIGN_RIGHT); Fl_Scroll *s = new Fl_Scroll(2 * WB, 3 * WB + 2 * BH, IW + 20, height - 5 * WB - 2 * BH); - i = 0; + int i = 0; while(MeshOptions_Color[i].str) { mesh_col[i] = new Fl_Button(2 * WB, 3 * WB + (2 + i) * BH, IW, BH, MeshOptions_Color[i].str); mesh_col[i]->callback(color_cb, (void *)MeshOptions_Color[i].function); i++; } s->end(); + o->end(); } o->end(); @@ -1994,8 +2151,9 @@ void GUI::create_option_window() Fl_Box *text = new Fl_Box(FL_NO_BOX, 2 * WB, 3 * WB + 1 * BH, width - 4 * WB, 2 * BH, "There are no global solver options available yet.\n\n" - "To define your own solver interface, edit the option file."); + "To define your own solver interface, you must edit the option file."); text->align(FL_ALIGN_LEFT | FL_ALIGN_TOP | FL_ALIGN_INSIDE | FL_ALIGN_WRAP); + o->end(); } o->end(); @@ -2047,7 +2205,7 @@ void GUI::create_option_window() // WARNING! Don't forget to add the set_changed_cb() callback to any new widget! // initialise all buttons to NULL (see the clear_changed() in view_options_ok_cb) - for(i = 0; i < VIEW_OPT_BUTT; i++) { + for(int i = 0; i < VIEW_OPT_BUTT; i++) { view_butt[i] = NULL; view_value[i] = NULL; view_input[i] = NULL; @@ -2059,154 +2217,232 @@ void GUI::create_option_window() view_window->hide(); { Fl_Tabs *o = new Fl_Tabs(WB, WB, width - 2 * WB, height - 2 * WB); - // General { Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "General"); view_butt[1] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW / 2 - WB, BH, "3D view"); + view_butt[1]->type(FL_RADIO_BUTTON); + view_butt[1]->down_box(RADIO_BOX); + view_butt[1]->selection_color(RADIO_COLOR); + view_butt[1]->callback(set_changed_cb, 0); + view_butt[2] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "2D space table"); - view_butt[3] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW / 2 - WB, BH, "2D time table"); - for(i = 1; i <= 3; i++) { - view_butt[i]->type(FL_RADIO_BUTTON); - view_butt[i]->down_box(RADIO_BOX); - view_butt[i]->selection_color(RADIO_COLOR); - view_butt[i]->callback(set_changed_cb, 0); - } + view_butt[2]->type(FL_RADIO_BUTTON); + view_butt[2]->down_box(RADIO_BOX); + view_butt[2]->selection_color(RADIO_COLOR); + view_butt[2]->callback(set_changed_cb, 0); - view_input[0] = new Fl_Input(2 * WB, 2 * WB + 4 * BH, IW, BH, "Name"); - view_input[1] = new Fl_Input(2 * WB, 2 * WB + 5 * BH, IW, BH, "Format"); - for(i = 0; i <= 1; i++) { - view_input[i]->align(FL_ALIGN_RIGHT); - view_input[i]->callback(set_changed_cb, 0); - } + view_butt[3] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW / 2 - WB, BH, "2D time table"); + view_butt[3]->type(FL_RADIO_BUTTON); + view_butt[3]->down_box(RADIO_BOX); + view_butt[3]->selection_color(RADIO_COLOR); + view_butt[3]->callback(set_changed_cb, 0); int sw = (int)(1.5 * fontsize); - view_butt_rep[0] = new Fl_Repeat_Button(2 * WB, 2 * WB + 6 * BH, sw, BH, "-"); + view_butt_rep[0] = new Fl_Repeat_Button(2 * WB, 2 * WB + 4 * BH, sw, BH, "-"); //no set_changed since has its own callback - view_butt_rep[1] = new Fl_Repeat_Button(2 * WB + IW - sw, 2 * WB + 6 * BH, sw, BH, "+"); + view_butt_rep[1] = new Fl_Repeat_Button(2 * WB + IW - sw, 2 * WB + 4 * BH, sw, BH, "+"); //no set_changed since has its own callback - view_value[50] = new Fl_Value_Input(2 * WB + sw, 2 * WB + 6 * BH, IW - 2 * sw, BH); + view_value[50] = new Fl_Value_Input(2 * WB + sw, 2 * WB + 4 * BH, IW - 2 * sw, BH); view_value[50]->align(FL_ALIGN_RIGHT); view_value[50]->minimum(0); view_value[50]->maximum(0); view_value[50]->step(1); //no set_changed since has its own callback - Fl_Box *a = new Fl_Box(2 * WB + IW, 2 * WB + 6 * BH, IW / 2, BH, "Step"); + Fl_Box *a = new Fl_Box(2 * WB + IW, 2 * WB + 4 * BH, IW / 2, BH, "Step"); a->box(FL_NO_BOX); a->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); - view_value[20] = new Fl_Value_Input(2 * WB, 2 * WB + 7 * BH, IW / 2, BH); - view_value[21] = new Fl_Value_Input(2 * WB + IW / 2, 2 * WB + 7 * BH, IW / 2, BH, "Position"); - view_value[22] = new Fl_Value_Input(2 * WB, 2 * WB + 8 * BH, IW / 2, BH); - view_value[23] = new Fl_Value_Input(2 * WB + IW / 2, 2 * WB + 8 * BH, IW / 2, BH, "Size"); - for(i = 20; i <= 23; i++) { - view_value[i]->align(FL_ALIGN_RIGHT); - view_value[i]->callback(set_changed_cb, 0); - } + view_input[0] = new Fl_Input(2 * WB, 2 * WB + 5 * BH, IW, BH, "Name"); + view_input[0]->align(FL_ALIGN_RIGHT); + view_input[0]->callback(set_changed_cb, 0); - view_butt[8] = new Fl_Check_Button(width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Show time"); - view_butt[5] = new Fl_Check_Button(width / 2, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Show annotations"); - view_butt[5]->tooltip("(Alt+n)"); - view_butt[4] = new Fl_Check_Button(width / 2, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Show scale"); - view_butt[4]->tooltip("(Alt+i)"); - view_butt[6] = new Fl_Check_Button(width / 2, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Transparent scale"); - view_butt[7] = new Fl_Check_Button(width / 2, 2 * WB + 5 * BH, BW / 2 - WB, BH, "Auto position"); - for(i = 4; i <= 8; i++) { - view_butt[i]->type(FL_TOGGLE_BUTTON); - view_butt[i]->down_box(TOGGLE_BOX); - view_butt[i]->selection_color(TOGGLE_COLOR); - view_butt[i]->callback(set_changed_cb, 0); - } + view_input[1] = new Fl_Input(2 * WB, 2 * WB + 6 * BH, IW, BH, "Format"); + view_input[1]->align(FL_ALIGN_RIGHT); + view_input[1]->callback(set_changed_cb, 0); - o->end(); - } - // 3D - { - view_3d = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "3D"); - view_3d->hide(); - - view_butt[10] = new Fl_Check_Button(width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Show elements"); - view_butt[11] = new Fl_Check_Button(width / 2, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Enable lighting"); - view_butt[11]->tooltip("(Alt+w)"); - view_butt[9] = new Fl_Check_Button(width / 2, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Use two-side lighting"); - view_butt[12] = new Fl_Check_Button(width / 2, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Smooth normals"); - for(i = 9; i <= 12; i++) { - view_butt[i]->type(FL_TOGGLE_BUTTON); - view_butt[i]->down_box(TOGGLE_BOX); - view_butt[i]->selection_color(TOGGLE_COLOR); - view_butt[i]->callback(set_changed_cb, 0); - } - view_value[10] = new Fl_Value_Input(width / 2, 2 * WB + 5 * BH, IW, BH, "Angle"); - view_value[10]->minimum(0.); - view_value[10]->step(1.); - view_value[10]->maximum(180.); - view_value[11] = new Fl_Value_Input(width / 2, 2 * WB + 6 * BH, IW, BH, "Boundary"); - view_value[11]->minimum(0); - view_value[11]->step(1); - view_value[11]->maximum(3); - view_value[12] = new Fl_Value_Input(width / 2, 2 * WB + 7 * BH, IW, BH, "Explode"); - view_value[12]->minimum(0.); - view_value[12]->step(0.01); - view_value[12]->maximum(1.); - for(i = 10; i <= 12; i++) { - view_value[i]->align(FL_ALIGN_RIGHT); - view_value[i]->callback(set_changed_cb, 0); + { + view_2d = new Fl_Group(2 * WB, 2 * WB + 7 * BH, width - 2 * WB, 4 * BH, 0); + + view_input[2] = new Fl_Input(2 * WB, 2 * WB + 7 * BH, IW, BH, "Abscissa name"); + view_input[2]->align(FL_ALIGN_RIGHT); + view_input[2]->callback(set_changed_cb, 0); + + view_input[3] = new Fl_Input(2 * WB, 2 * WB + 8 * BH, IW, BH, "Abscissa format"); + view_input[3]->align(FL_ALIGN_RIGHT); + view_input[3]->callback(set_changed_cb, 0); + + view_value[25] = new Fl_Value_Input(2 * WB, 2 * WB + 9 * BH, IW, BH, "Number of abscissa points"); + view_value[25]->minimum(0.); + view_value[25]->step(1); + view_value[25]->maximum(256); + view_value[25]->align(FL_ALIGN_RIGHT); + view_value[25]->callback(set_changed_cb, 0); + + static Fl_Menu_Item menu_grid_mode[] = { + {"None", 0, 0, 0}, + {"Axes", 0, 0, 0}, + {"Box", 0, 0, 0}, + {"Full", 0, 0, 0}, + {0} + }; + view_choice[8] = new Fl_Choice(2 * WB, 2 * WB + 10 * BH, IW, BH, "Grid mode"); + view_choice[8]->menu(menu_grid_mode); + view_choice[8]->align(FL_ALIGN_RIGHT); + view_choice[8]->callback(set_changed_cb, 0); + + view_2d->end(); } - view_butt[13] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Show points"); - view_butt[14] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Show lines"); - view_butt[15] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Show triangles"); - view_butt[16] = new Fl_Check_Button(2 * WB, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Show quadrangles"); - view_butt[17] = new Fl_Check_Button(2 * WB, 2 * WB + 5 * BH, BW / 2 - WB, BH, "Show tetrahedra"); - view_butt[18] = new Fl_Check_Button(2 * WB, 2 * WB + 6 * BH, BW / 2 - WB, BH, "Show hexahedra"); - view_butt[19] = new Fl_Check_Button(2 * WB, 2 * WB + 7 * BH, BW / 2 - WB, BH, "Show prisms"); - view_butt[20] = new Fl_Check_Button(2 * WB, 2 * WB + 8 * BH, BW / 2 - WB, BH, "Show pyramids"); - view_butt[21] = new Fl_Check_Button(width / 2, 2 * WB + 8 * BH, BW / 2 - WB, BH, "Show scalar values"); - view_butt[22] = new Fl_Check_Button(width / 2, 2 * WB + 9 * BH, BW / 2 - WB, BH, "Show vector values"); - view_butt[23] = new Fl_Check_Button(width / 2, 2 * WB + 10 * BH, BW / 2 - WB, BH, "Show tensor values"); - for(i = 13; i <= 23; i++) { - view_butt[i]->type(FL_TOGGLE_BUTTON); - view_butt[i]->down_box(TOGGLE_BOX); - view_butt[i]->selection_color(TOGGLE_COLOR); - view_butt[i]->callback(set_changed_cb, 0); - } + view_butt[7] = new Fl_Check_Button(width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Set position automatically"); + view_butt[7]->type(FL_TOGGLE_BUTTON); + view_butt[7]->down_box(TOGGLE_BOX); + view_butt[7]->selection_color(TOGGLE_COLOR); + view_butt[7]->callback(set_changed_cb, 0); + + view_value[20] = new Fl_Value_Input(width /2, 2 * WB + 2 * BH, IW / 2, BH); + view_value[20]->align(FL_ALIGN_RIGHT); + view_value[20]->callback(set_changed_cb, 0); + view_value[20]->minimum(0); + view_value[20]->maximum(1024); + view_value[20]->step(1); + view_value[21] = new Fl_Value_Input(width / 2 + IW / 2, 2 * WB + 2 * BH, IW / 2, BH, "Position"); + view_value[21]->align(FL_ALIGN_RIGHT); + view_value[21]->callback(set_changed_cb, 0); + view_value[21]->minimum(0); + view_value[21]->maximum(1024); + view_value[21]->step(1); + + view_value[22] = new Fl_Value_Input(width /2, 2 * WB + 3 * BH, IW / 2, BH); + view_value[22]->align(FL_ALIGN_RIGHT); + view_value[22]->callback(set_changed_cb, 0); + view_value[22]->minimum(0); + view_value[22]->maximum(1024); + view_value[22]->step(1); + view_value[23] = new Fl_Value_Input(width / 2 + IW / 2, 2 * WB + 3 * BH, IW / 2, BH, "Size"); + view_value[23]->align(FL_ALIGN_RIGHT); + view_value[23]->callback(set_changed_cb, 0); + view_value[23]->minimum(0); + view_value[23]->maximum(1024); + view_value[23]->step(1); - view_3d->end(); + o->end(); } - // 2D { - view_2d = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "2D"); - view_2d->hide(); - - view_input[2] = new Fl_Input(2 * WB, 2 * WB + 1 * BH, IW, BH, "Abscissa name"); - view_input[2]->align(FL_ALIGN_RIGHT); - view_input[2]->callback(set_changed_cb, 0); - - view_input[3] = new Fl_Input(2 * WB, 2 * WB + 2 * BH, IW, BH, "Abscissa format"); - view_input[3]->align(FL_ALIGN_RIGHT); - view_input[3]->callback(set_changed_cb, 0); - - view_value[25] = new Fl_Value_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "Abscissa points"); - view_value[25]->minimum(0.); - view_value[25]->step(1); - view_value[25]->maximum(256); - view_value[26] = new Fl_Value_Input(2 * WB, 2 * WB + 4 * BH, IW, BH, "Grid mode"); - view_value[26]->minimum(0.); - view_value[26]->step(1); - view_value[26]->maximum(3); - for(i = 25; i <= 26; i++) { - view_value[i]->align(FL_ALIGN_RIGHT); - view_value[i]->callback(set_changed_cb, 0); - } + Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Visibility"); + o->hide(); - view_2d->end(); + view_butt[13] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Points"); + view_butt[13]->type(FL_TOGGLE_BUTTON); + view_butt[13]->down_box(TOGGLE_BOX); + view_butt[13]->selection_color(TOGGLE_COLOR); + view_butt[13]->callback(set_changed_cb, 0); + + view_butt[14] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Lines"); + view_butt[14]->type(FL_TOGGLE_BUTTON); + view_butt[14]->down_box(TOGGLE_BOX); + view_butt[14]->selection_color(TOGGLE_COLOR); + view_butt[14]->callback(set_changed_cb, 0); + + view_butt[15] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Triangles"); + view_butt[15]->type(FL_TOGGLE_BUTTON); + view_butt[15]->down_box(TOGGLE_BOX); + view_butt[15]->selection_color(TOGGLE_COLOR); + view_butt[15]->callback(set_changed_cb, 0); + + view_butt[16] = new Fl_Check_Button(2 * WB, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Quadrangles"); + view_butt[16]->type(FL_TOGGLE_BUTTON); + view_butt[16]->down_box(TOGGLE_BOX); + view_butt[16]->selection_color(TOGGLE_COLOR); + view_butt[16]->callback(set_changed_cb, 0); + + view_butt[17] = new Fl_Check_Button(2 * WB, 2 * WB + 5 * BH, BW / 2 - WB, BH, "Tetrahedra"); + view_butt[17]->type(FL_TOGGLE_BUTTON); + view_butt[17]->down_box(TOGGLE_BOX); + view_butt[17]->selection_color(TOGGLE_COLOR); + view_butt[17]->callback(set_changed_cb, 0); + + view_butt[18] = new Fl_Check_Button(2 * WB, 2 * WB + 6 * BH, BW / 2 - WB, BH, "Hexahedra"); + view_butt[18]->type(FL_TOGGLE_BUTTON); + view_butt[18]->down_box(TOGGLE_BOX); + view_butt[18]->selection_color(TOGGLE_COLOR); + view_butt[18]->callback(set_changed_cb, 0); + + view_butt[19] = new Fl_Check_Button(2 * WB, 2 * WB + 7 * BH, BW / 2 - WB, BH, "Prisms"); + view_butt[19]->type(FL_TOGGLE_BUTTON); + view_butt[19]->down_box(TOGGLE_BOX); + view_butt[19]->selection_color(TOGGLE_COLOR); + view_butt[19]->callback(set_changed_cb, 0); + + view_butt[20] = new Fl_Check_Button(2 * WB, 2 * WB + 8 * BH, BW / 2 - WB, BH, "Pyramids"); + view_butt[20]->type(FL_TOGGLE_BUTTON); + view_butt[20]->down_box(TOGGLE_BOX); + view_butt[20]->selection_color(TOGGLE_COLOR); + view_butt[20]->callback(set_changed_cb, 0); + + view_butt[4] = new Fl_Check_Button(width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Scale"); + view_butt[4]->tooltip("(Alt+i)"); + view_butt[4]->type(FL_TOGGLE_BUTTON); + view_butt[4]->down_box(TOGGLE_BOX); + view_butt[4]->selection_color(TOGGLE_COLOR); + view_butt[4]->callback(set_changed_cb, 0); + + view_butt[8] = new Fl_Check_Button(width / 2, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Step value"); + view_butt[8]->type(FL_TOGGLE_BUTTON); + view_butt[8]->down_box(TOGGLE_BOX); + view_butt[8]->selection_color(TOGGLE_COLOR); + view_butt[8]->callback(set_changed_cb, 0); + + view_butt[5] = new Fl_Check_Button(width / 2, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Annotations"); + view_butt[5]->tooltip("(Alt+n)"); + view_butt[5]->type(FL_TOGGLE_BUTTON); + view_butt[5]->down_box(TOGGLE_BOX); + view_butt[5]->selection_color(TOGGLE_COLOR); + view_butt[5]->callback(set_changed_cb, 0); + + view_butt[10] = new Fl_Check_Button(width / 2, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Element edges"); + view_butt[10]->type(FL_TOGGLE_BUTTON); + view_butt[10]->down_box(TOGGLE_BOX); + view_butt[10]->selection_color(TOGGLE_COLOR); + view_butt[10]->callback(set_changed_cb, 0); + + static Fl_Menu_Item menu_boundary[] = { + {"None", 0, 0, 0}, + {"Dimension - 1", 0, 0, 0}, + {"Dimension - 2", 0, 0, 0}, + {"Dimension - 3", 0, 0, 0}, + {0} + }; + view_choice[9] = new Fl_Choice(width / 2, 2 * WB + 5 * BH, IW, BH, "Boundary"); + view_choice[9]->menu(menu_boundary); + view_choice[9]->align(FL_ALIGN_RIGHT); + view_choice[9]->callback(set_changed_cb, 0); + + view_butt[21] = new Fl_Check_Button(width / 2, 2 * WB + 6 * BH, BW / 2 - WB, BH, "Scalar values"); + view_butt[21]->type(FL_TOGGLE_BUTTON); + view_butt[21]->down_box(TOGGLE_BOX); + view_butt[21]->selection_color(TOGGLE_COLOR); + view_butt[21]->callback(set_changed_cb, 0); + + view_butt[22] = new Fl_Check_Button(width / 2, 2 * WB + 7 * BH, BW / 2 - WB, BH, "Vector values"); + view_butt[22]->type(FL_TOGGLE_BUTTON); + view_butt[22]->down_box(TOGGLE_BOX); + view_butt[22]->selection_color(TOGGLE_COLOR); + view_butt[22]->callback(set_changed_cb, 0); + + view_butt[23] = new Fl_Check_Button(width / 2, 2 * WB + 8 * BH, BW / 2 - WB, BH, "Tensor values"); + view_butt[23]->type(FL_TOGGLE_BUTTON); + view_butt[23]->down_box(TOGGLE_BOX); + view_butt[23]->selection_color(TOGGLE_COLOR); + view_butt[23]->callback(set_changed_cb, 0); + + o->end(); } - // Range { view_range = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Range"); view_range->hide(); - view_value[30] = new Fl_Value_Input(2 * WB, 2 * WB + 1 * BH, IW, BH, "Intervals"); + view_value[30] = new Fl_Value_Input(2 * WB, 2 * WB + 1 * BH, IW, BH, "Number of intervals"); view_value[30]->align(FL_ALIGN_RIGHT); view_value[30]->minimum(1); view_value[30]->maximum(256); @@ -2240,11 +2476,12 @@ void GUI::create_option_window() //view_choice[7]->callback(set_changed_cb, 0); view_value[31] = new Fl_Value_Input(2 * WB, 2 * WB + 4 * BH, IW, BH, "Custom minimum"); + view_value[31]->align(FL_ALIGN_RIGHT); + view_value[31]->callback(set_changed_cb, 0); + view_value[32] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW, BH, "Custom maximum"); - for(i = 31; i <= 32; i++) { - view_value[i]->align(FL_ALIGN_RIGHT); - view_value[i]->callback(set_changed_cb, 0); - } + view_value[32]->align(FL_ALIGN_RIGHT); + view_value[32]->callback(set_changed_cb, 0); static Fl_Menu_Item menu_scale[] = { {"Linear", 0, 0, 0}, @@ -2257,7 +2494,7 @@ void GUI::create_option_window() view_choice[1]->align(FL_ALIGN_RIGHT); view_choice[1]->callback(set_changed_cb, 0); - view_butt[38] = new Fl_Check_Button(2 * WB, 2 * WB + 7 * BH, IW, BH, "Saturate values"); + view_butt[38] = new Fl_Check_Button(2 * WB, 2 * WB + 7 * BH, BW, BH, "Saturate values"); view_butt[38]->type(FL_TOGGLE_BUTTON); view_butt[38]->down_box(TOGGLE_BOX); view_butt[38]->selection_color(TOGGLE_COLOR); @@ -2265,45 +2502,65 @@ void GUI::create_option_window() view_range->end(); } - // Offset and Raise { Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Offset"); o->hide(); + view_value[40] = new Fl_Value_Input(2 * WB, 2 * WB + 1 * BH, IW, BH, "X offset"); + view_value[40]->align(FL_ALIGN_RIGHT); + view_value[40]->callback(set_changed_cb, 0); + view_value[41] = new Fl_Value_Input(2 * WB, 2 * WB + 2 * BH, IW, BH, "Y offset"); + view_value[41]->align(FL_ALIGN_RIGHT); + view_value[41]->callback(set_changed_cb, 0); + view_value[42] = new Fl_Value_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "Z offset"); + view_value[42]->align(FL_ALIGN_RIGHT); + view_value[42]->callback(set_changed_cb, 0); + view_value[43] = new Fl_Value_Input(width / 2, 2 * WB + 1 * BH, IW, BH, "X raise"); + view_value[43]->align(FL_ALIGN_RIGHT); + view_value[43]->callback(set_changed_cb, 0); + view_value[44] = new Fl_Value_Input(width / 2, 2 * WB + 2 * BH, IW, BH, "Y raise"); + view_value[44]->align(FL_ALIGN_RIGHT); + view_value[44]->callback(set_changed_cb, 0); + view_value[45] = new Fl_Value_Input(width / 2, 2 * WB + 3 * BH, IW, BH, "Z raise"); - for(i = 40; i <= 45; i++) { - view_value[i]->align(FL_ALIGN_RIGHT); - view_value[i]->callback(set_changed_cb, 0); - } + view_value[45]->align(FL_ALIGN_RIGHT); + view_value[45]->callback(set_changed_cb, 0); + o->end(); } - // Aspect { Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Aspect"); o->hide(); - view_choice[5] = new Fl_Choice(2 * WB, 2 * WB + 1 * BH, IW, BH, "Point display"); + view_value[12] = new Fl_Value_Input(2 * WB, 2 * WB + 1 * BH, IW, BH, "Explosion factor"); + view_value[12]->minimum(0.); + view_value[12]->step(0.01); + view_value[12]->maximum(1.); + view_value[12]->align(FL_ALIGN_RIGHT); + view_value[12]->callback(set_changed_cb, 0); + + view_choice[5] = new Fl_Choice(2 * WB, 2 * WB + 2 * BH, IW, BH, "Point display"); view_choice[5]->menu(menu_point_display); view_choice[5]->align(FL_ALIGN_RIGHT); view_choice[5]->callback(set_changed_cb, 0); - view_value[61] = new Fl_Value_Input(2 * WB, 2 * WB + 2 * BH, IW, BH, "Point size"); + view_value[61] = new Fl_Value_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "Point size"); view_value[61]->minimum(0.1); view_value[61]->maximum(50); view_value[61]->step(0.1); view_value[61]->align(FL_ALIGN_RIGHT); view_value[61]->callback(set_changed_cb, 0); - view_choice[6] = new Fl_Choice(2 * WB, 2 * WB + 3 * BH, IW, BH, "Line display"); + view_choice[6] = new Fl_Choice(2 * WB, 2 * WB + 4 * BH, IW, BH, "Line display"); view_choice[6]->menu(menu_line_display); view_choice[6]->align(FL_ALIGN_RIGHT); view_choice[6]->callback(set_changed_cb, 0); - view_value[62] = new Fl_Value_Input(2 * WB, 2 * WB + 4 * BH, IW, BH, "Line width"); + view_value[62] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW, BH, "Line width"); view_value[62]->minimum(0.1); view_value[62]->maximum(50); view_value[62]->step(0.1); @@ -2311,7 +2568,7 @@ void GUI::create_option_window() view_value[62]->callback(set_changed_cb, 0); { - view_vector = new Fl_Group(2 * WB, 2 * WB + 4 * BH, width - 2 * WB, 6 * BH, 0); + view_vector = new Fl_Group(2 * WB, 2 * WB + 6 * BH, width - 2 * WB, 5 * BH, 0); static Fl_Menu_Item menu_vectype[] = { {"Line", 0, 0, 0}, @@ -2321,21 +2578,21 @@ void GUI::create_option_window() {"Displacement", 0, 0, 0}, {0} }; - view_choice[2] = new Fl_Choice(2 * WB, 2 * WB + 5 * BH, IW, BH, "Vector display"); + view_choice[2] = new Fl_Choice(2 * WB, 2 * WB + 6 * BH, IW, BH, "Vector display"); view_choice[2]->menu(menu_vectype); view_choice[2]->align(FL_ALIGN_RIGHT); view_choice[2]->callback(set_changed_cb, 0); - view_push_butt[0] = new Fl_Button(2 * IW - 2 * WB, 2 * WB + 5 * BH, (int)(1.5*BB), BH, "Edit arrow shape"); + view_push_butt[0] = new Fl_Button(2 * IW - 2 * WB, 2 * WB + 6 * BH, (int)(1.5*BB), BH, "Edit arrow shape"); - view_value[60] = new Fl_Value_Input(2 * WB, 2 * WB + 6 * BH, IW, BH, "Arrow size"); + view_value[60] = new Fl_Value_Input(2 * WB, 2 * WB + 7 * BH, IW, BH, "Arrow size"); view_value[60]->minimum(0); view_value[60]->maximum(500); view_value[60]->step(1); view_value[60]->align(FL_ALIGN_RIGHT); view_value[60]->callback(set_changed_cb, 0); - view_value[63] = new Fl_Value_Input(2 * WB, 2 * WB + 7 * BH, IW, BH, "Displacement factor"); + view_value[63] = new Fl_Value_Input(2 * WB, 2 * WB + 8 * BH, IW, BH, "Displacement factor"); view_value[63]->align(FL_ALIGN_RIGHT); view_value[63]->callback(set_changed_cb, 0); @@ -2344,7 +2601,7 @@ void GUI::create_option_window() {"Vertex centered", 0, 0, 0}, {0} }; - view_choice[3] = new Fl_Choice(2 * WB, 2 * WB + 8 * BH, IW, BH, "Arrow location"); + view_choice[3] = new Fl_Choice(2 * WB, 2 * WB + 9 * BH, IW, BH, "Arrow location"); view_choice[3]->menu(menu_vecloc); view_choice[3]->align(FL_ALIGN_RIGHT); view_choice[3]->callback(set_changed_cb, 0); @@ -2354,7 +2611,7 @@ void GUI::create_option_window() //{"Eigenvectors", 0, 0, 0}, //not implemented yet {0} }; - view_choice[4] = new Fl_Choice(2 * WB, 2 * WB + 9 * BH, IW, BH, "Tensor display"); + view_choice[4] = new Fl_Choice(2 * WB, 2 * WB + 10 * BH, IW, BH, "Tensor display"); view_choice[4]->menu(menu_tensor); view_choice[4]->align(FL_ALIGN_RIGHT); view_choice[4]->callback(set_changed_cb, 0); @@ -2364,13 +2621,52 @@ void GUI::create_option_window() o->end(); } - // Colors { - Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB, "Colors"); + Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB, "Light"); o->hide(); + + view_butt[11] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW, BH, "Enable lighting"); + view_butt[11]->tooltip("(Alt+w)"); + view_butt[11]->type(FL_TOGGLE_BUTTON); + view_butt[11]->down_box(TOGGLE_BOX); + view_butt[11]->selection_color(TOGGLE_COLOR); + view_butt[11]->callback(set_changed_cb, 0); + + view_butt[9] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW, BH, "Use two-side lighting"); + view_butt[9]->type(FL_TOGGLE_BUTTON); + view_butt[9]->down_box(TOGGLE_BOX); + view_butt[9]->selection_color(TOGGLE_COLOR); + view_butt[9]->callback(set_changed_cb, 0); + + view_butt[12] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW, BH, "Smooth normals"); + view_butt[12]->type(FL_TOGGLE_BUTTON); + view_butt[12]->down_box(TOGGLE_BOX); + view_butt[12]->selection_color(TOGGLE_COLOR); + view_butt[12]->callback(set_changed_cb, 0); + + view_value[10] = new Fl_Value_Input(2 * WB, 2 * WB + 4 * BH, IW, BH, "Smoothing threshold angle"); + view_value[10]->minimum(0.); + view_value[10]->step(1.); + view_value[10]->maximum(180.); + view_value[10]->align(FL_ALIGN_RIGHT); + view_value[10]->callback(set_changed_cb, 0); + + o->end(); + } + { + Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB, "Color"); + o->hide(); + view_colorbar_window = new Colorbar_Window(2 * WB, 2 * WB + BH, width - 4 * WB, height - 4 * WB - BH); view_colorbar_window->end(); - //no set_changed since colorbarwindow has its own callbacks + // no 'set_changed' since Colorbar_Window has its own callbacks + + // this exposes the MacOSX clipping bug with a regular subwindow: + //view_colorbar_window->hide(); + //Fl_Window *ww = new Fl_Window(2 * WB, 2 * WB + BH, width - 4 * WB, height - 4 * WB - BH); + //ww->box(FL_DOWN_BOX); + //ww->end(); + o->end(); } o->end(); @@ -2390,13 +2686,11 @@ void GUI::update_view_window(int num) view_number = num; Post_View *v = (Post_View *) List_Pointer(CTX.post.list, num); - // general opt_view_name(num, GMSH_GUI, NULL); opt_view_format(num, GMSH_GUI, NULL); opt_view_type(num, GMSH_GUI, 0); opt_view_show_scale(num, GMSH_GUI, 0); opt_view_draw_strings(num, GMSH_GUI, 0); - opt_view_transparent_scale(num, GMSH_GUI, 0); opt_view_auto_position(num, GMSH_GUI, 0); if(v->NbSP) { view_butt[2]->activate(); @@ -2411,14 +2705,11 @@ void GUI::update_view_window(int num) opt_view_size0(num, GMSH_GUI, 0); opt_view_size1(num, GMSH_GUI, 0); - //3D if(v->TextOnly) { - view_3d->deactivate(); view_range->deactivate(); view_butt[1]->deactivate(); } else { - view_3d->activate(); view_range->activate(); view_butt[1]->activate(); } @@ -2441,7 +2732,6 @@ void GUI::update_view_window(int num) opt_view_draw_vectors(num, GMSH_GUI, 0); opt_view_draw_tensors(num, GMSH_GUI, 0); - //2D if(v->NbSP) view_2d->activate(); else @@ -2451,7 +2741,6 @@ void GUI::update_view_window(int num) opt_view_nb_abscissa(num, GMSH_GUI, 0); opt_view_grid(num, GMSH_GUI, 0); - // range opt_view_nb_iso(num, GMSH_GUI, 0); opt_view_intervals_type(num, GMSH_GUI, 0); int range_type = (int)opt_view_range_type(num, GMSH_GUI, 0); @@ -2468,7 +2757,6 @@ void GUI::update_view_window(int num) opt_view_scale_type(num, GMSH_GUI, 0); opt_view_saturate_values(num, GMSH_GUI, 0); - // offset/raise opt_view_offset0(num, GMSH_GUI, 0); opt_view_offset1(num, GMSH_GUI, 0); opt_view_offset2(num, GMSH_GUI, 0); @@ -2490,7 +2778,6 @@ void GUI::update_view_window(int num) view_value[i]->maximum(val2); } - // timestep if(v->NbTimeStep == 1) { view_value[50]->deactivate(); view_butt_rep[0]->deactivate(); @@ -2510,7 +2797,6 @@ void GUI::update_view_window(int num) opt_view_timestep(num, GMSH_GUI, 0); opt_view_show_time(num, GMSH_GUI, 0); - // aspect if(v->ScalarOnly) view_vector->deactivate(); else @@ -2526,7 +2812,6 @@ void GUI::update_view_window(int num) opt_view_tensor_type(num, GMSH_GUI, 0); view_push_butt[0]->callback(view_arrow_param_cb, (void*)num); - // colors view_colorbar_window->update(v->Name, v->Min, v->Max, &v->CT, &v->Changed); } @@ -3431,9 +3716,9 @@ void GUI::create_solver_window(int num) Fl_Button *b = new Fl_Button(2 * WB, 3 * WB + 2 * BH, BB, BH, "Choose"); b->callback(solver_choose_executable_cb, (void *)num); - solver[num].butt[2] = new Fl_Check_Button(2 * WB, 4 * WB + 3 * BH, LL, BH, "Client/server connection"); - solver[num].butt[0] = new Fl_Check_Button(2 * WB, 4 * WB + 4 * BH, LL, BH, "Automatic message display"); - solver[num].butt[1] = new Fl_Check_Button(2 * WB, 4 * WB + 5 * BH, LL, BH, "Automatic view merge"); + solver[num].butt[2] = new Fl_Check_Button(2 * WB, 4 * WB + 3 * BH, LL, BH, "Enable client-server connection"); + solver[num].butt[0] = new Fl_Check_Button(2 * WB, 4 * WB + 4 * BH, LL, BH, "Display client messages"); + solver[num].butt[1] = new Fl_Check_Button(2 * WB, 4 * WB + 5 * BH, LL, BH, "Merge views automatically"); for(i = 0; i < 3; i++) { solver[num].butt[i]->type(FL_TOGGLE_BUTTON); solver[num].butt[i]->down_box(TOGGLE_BOX); diff --git a/Fltk/GUI.h b/Fltk/GUI.h index 2dda47851a7e6bd445d6309a84dcd620aa89668a..27c3119b72b3caaa128105af2765e414d8b4c349 100644 --- a/Fltk/GUI.h +++ b/Fltk/GUI.h @@ -191,7 +191,7 @@ public: // view options int view_number ; Fl_Window *view_window ; - Fl_Group *view_3d, *view_2d, *view_range, *view_vector ; + Fl_Group *view_2d, *view_range, *view_vector ; #define VIEW_OPT_BUTT 100 Fl_Check_Button *view_butt[VIEW_OPT_BUTT] ; Fl_Value_Input *view_value[VIEW_OPT_BUTT] ; diff --git a/Fltk/Solvers.cpp b/Fltk/Solvers.cpp index b18f73f876a61fb6a687eb0b662dd2eab4412f95..8a71c879e579804bdd0b93552e061cc5b61cf448 100644 --- a/Fltk/Solvers.cpp +++ b/Fltk/Solvers.cpp @@ -1,4 +1,4 @@ -// $Id: Solvers.cpp,v 1.25 2004-05-22 01:24:17 geuzaine Exp $ +// $Id: Solvers.cpp,v 1.26 2004-07-30 12:22:02 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -74,7 +74,7 @@ int Solver(int num, char *args) break; case -4: Msg(GERROR, - "Solver not responding (is '%s' correctly installed/in your path?)", + "Solver not responding (is '%s' correctly installed and in your path?)", SINFO[num].executable_name); break; case -5: diff --git a/TODO b/TODO index 0e2f6f9f98128dc3ecca62adae67dd73c9965607..773d31a8cb02e794ad24855264328dc045e64095 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,4 @@ -$Id: TODO,v 1.58 2004-07-15 02:43:32 geuzaine Exp $ +$Id: TODO,v 1.59 2004-07-30 12:22:01 geuzaine Exp $ add an interactive way to choose the orientation of surfaces in surface loops and lines in line loops @@ -9,6 +9,11 @@ normals...) ******************************************************************** +fix the orientation of hexas, prisms and pyramids (reorder nodes +according to Orientation()) + +******************************************************************** + add parameter to transformation operations to copy the meshes ******************************************************************** @@ -25,8 +30,8 @@ add ternary operator and <,>,<=,>=,== tests in MathEval ******************************************************************** -on Macs, datasets with a bounding box < 1.e06 don't display properly -(probably because all OpenGL stuff is done inetrnally in single +on Macs, datasets with a bounding box < 1.e-06 don't display properly +(probably because all the OpenGL stuff is done ineternally in single precision...). Rescale? ******************************************************************** @@ -43,11 +48,6 @@ format... ******************************************************************** -add an option to plot the bounding box of views, with or without -labels (scales) - -******************************************************************** - find a better way to display the time/timestep in the scale... ******************************************************************** @@ -110,8 +110,9 @@ All surface meshes are made in a mean plane. If your surface cannot be projected into a plane with a 1-to-1 correspondance between the nodes, then gmsh will fail. -We should definitely use a better projection algorithm. See the work -by Desbrun et al. in CS for this. +We should definitely use a better projection algorithm +(e.g. intrinstic parameterization). See the work by Desbrun et al. in +CS for this. ******************************************************************** diff --git a/doc/VERSIONS b/doc/VERSIONS index d9e29bccb3cd9e7e582d40d4597e713e30c183d8..09b821cdb2d86bfa820da0fb89f69a80bc6b573b 100644 --- a/doc/VERSIONS +++ b/doc/VERSIONS @@ -1,9 +1,10 @@ -$Id: VERSIONS,v 1.238 2004-07-23 05:11:18 geuzaine Exp $ +$Id: VERSIONS,v 1.239 2004-07-30 12:22:02 geuzaine Exp $ New since 1.54: added background mesh support for Triangle; meshes can now be displayed using "smoothed" normals (like post-processing views); added GUI for clipping planes; new interactive -clipping/cutting plane definition; small bug fixes. +clipping/cutting plane definition; reorganized the Options GUI; small +bug fixes. New in 1.54: integrated Netgen (3D mesh quality optimization + alternative 3D algorithm); Extrude Surface now always automatically diff --git a/doc/texinfo/opt_general.texi b/doc/texinfo/opt_general.texi index d5341bfb228fd0ff9db8364a20d846a3dd79d70b..d5cb01ddf3142b026df5e7de829bef01e3ed3fd6 100644 --- a/doc/texinfo/opt_general.texi +++ b/doc/texinfo/opt_general.texi @@ -81,7 +81,7 @@ Saved in: @code{-} @item General.Clip0A First coefficient in equation for clipping plane 0 (`A' in `AX+BY+CZ+D=0')@* -Default value: @code{0}@* +Default value: @code{1}@* Saved in: @code{-} @item General.Clip0B @@ -106,7 +106,7 @@ Saved in: @code{-} @item General.Clip1A First coefficient in equation for clipping plane 1@* -Default value: @code{0}@* +Default value: @code{1}@* Saved in: @code{-} @item General.Clip1B @@ -131,7 +131,7 @@ Saved in: @code{-} @item General.Clip2A First coefficient in equation for clipping plane 2@* -Default value: @code{0}@* +Default value: @code{1}@* Saved in: @code{-} @item General.Clip2B @@ -156,7 +156,7 @@ Saved in: @code{-} @item General.Clip3A First coefficient in equation for clipping plane 3@* -Default value: @code{0}@* +Default value: @code{1}@* Saved in: @code{-} @item General.Clip3B @@ -181,7 +181,7 @@ Saved in: @code{-} @item General.Clip4A First coefficient in equation for clipping plane 4@* -Default value: @code{0}@* +Default value: @code{1}@* Saved in: @code{-} @item General.Clip4B @@ -206,7 +206,7 @@ Saved in: @code{-} @item General.Clip5A First coefficient in equation for clipping plane 5@* -Default value: @code{0}@* +Default value: @code{1}@* Saved in: @code{-} @item General.Clip5B diff --git a/doc/texinfo/opt_mesh.texi b/doc/texinfo/opt_mesh.texi index 76b97bb17591f15db1ed935f80e9b1c0ab2ce5cb..8fee166038878a29a87c8ceb3e19aae66e15145e 100644 --- a/doc/texinfo/opt_mesh.texi +++ b/doc/texinfo/opt_mesh.texi @@ -54,6 +54,11 @@ Draw the intersection volume layer as a surface@* Default value: @code{0}@* Saved in: @code{-} +@item Mesh.CutPlaneOnlyVolume +Cut only the volume elements@* +Default value: @code{0}@* +Saved in: @code{-} + @item Mesh.CutPlaneA First cut plane equation coefficient (`A' in `AX+BY+CZ+D=0')@* Default value: @code{1}@*