diff --git a/Common/Context.h b/Common/Context.h index 4bb8e00afd01bc22516fefacb67625ab8b06e7f9..cc2a451c6e7e7a7e3eef00aa4067dd082740115f 100644 --- a/Common/Context.h +++ b/Common/Context.h @@ -160,7 +160,7 @@ public : double msh_file_version; int vis_type, changed, display_lists; int draw; - int points, lines, surfaces, volumes; + int points, lines, surfaces_edges, surfaces_faces, volumes_edges, volumes_faces; int points_num, lines_num, surfaces_num, volumes_num; int point_type, line_type; // flat or 3D double point_size, line_width; diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h index a9d457af839e49b11f830ead8751def4f6c14cb7..4e3cbccfc9b825227a07c122dde0047ff2257833 100644 --- a/Common/DefaultOptions.h +++ b/Common/DefaultOptions.h @@ -652,13 +652,13 @@ StringXNumber GeometryOptions_Number[] = { "Enable lighting for the geometry" }, { F|O, "Lines" , opt_geometry_lines , 1. , "Display geometry curves?" }, - { F|O, "LinesNumbers" , opt_geometry_lines_num , 0. , + { F|O, "LineNumbers" , opt_geometry_lines_num , 0. , "Display curve numbers?" }, { F|O, "LineSelectWidth" , opt_geometry_line_sel_width , 2. , "Display width of selected lines (in pixels)" }, { F|O, "LineType" , opt_geometry_line_type , 0. , "Display lines as solid color segments (0) or 3D cylinders (1)" }, - { F|O, "LineWidth" , opt_geometry_line_width , 1.0 , + { F|O, "LineWidth" , opt_geometry_line_width , 1.5 , "Display width of lines (in pixels)" }, { F|O, "Normals" , opt_geometry_normals , 0. , @@ -671,11 +671,11 @@ StringXNumber GeometryOptions_Number[] = { { F|O, "Points" , opt_geometry_points , 1. , "Display geometry points?" }, - { F|O, "PointsNumbers" , opt_geometry_points_num , 0. , + { F|O, "PointNumbers" , opt_geometry_points_num , 0. , "Display points numbers?" }, { F|O, "PointSelectSize" , opt_geometry_point_sel_size , 5. , "Display size of selected points (in pixels)" }, - { F|O, "PointSize" , opt_geometry_point_size , 3. , + { F|O, "PointSize" , opt_geometry_point_size , 4. , "Display size of points (in pixels)" }, { F|O, "PointType" , opt_geometry_point_type , 0. , "Display points as solid color dots (0) or 3D spheres (1)" }, @@ -688,7 +688,7 @@ StringXNumber GeometryOptions_Number[] = { "Automatically create physical entities when importing STL faces as geometrical surfaces" }, { F|O, "Surfaces" , opt_geometry_surfaces , 0. , "Display geometry surfaces?" }, - { F|O, "SurfacesNumbers" , opt_geometry_surfaces_num , 0. , + { F|O, "SurfaceNumbers" , opt_geometry_surfaces_num , 0. , "Display surface numbers?" }, { F|O, "Tangents" , opt_geometry_tangents , 0. , @@ -696,7 +696,7 @@ StringXNumber GeometryOptions_Number[] = { { F|O, "Volumes" , opt_geometry_volumes , 0. , "Display geometry volumes? (not implemented yet)" }, - { F|O, "VolumesNumbers" , opt_geometry_volumes_num , 0. , + { F|O, "VolumeNumbers" , opt_geometry_volumes_num , 0. , "Display volume numbers? (not implemented yet)" }, { 0, NULL , NULL , 0. , NULL } @@ -752,14 +752,14 @@ StringXNumber MeshOptions_Number[] = { { F|O, "Light" , opt_mesh_light , 0. , "Enable lighting for the mesh" }, - { F|O, "Lines" , opt_mesh_lines , 1. , - "Display mesh vertices on curves?" }, - { F|O, "LinesNumbers" , opt_mesh_lines_num , 0. , + { F|O, "Lines" , opt_mesh_lines , 0. , + "Display mesh lines (1D elements)?" }, + { F|O, "LineNumbers" , opt_mesh_lines_num , 0. , "Display mesh line numbers?" }, { F|O, "LineType" , opt_mesh_line_type , 0. , - "Display lines as solid color segments (0) or 3D cylinders (1)" }, + "Display mesh lines as solid color segments (0) or 3D cylinders (1)" }, { F|O, "LineWidth" , opt_mesh_line_width , 1.0 , - "Display width of lines (in pixels)" }, + "Display width of mesh lines (in pixels)" }, { F|O, "MinimumCirclePoints" , opt_mesh_min_circ_points, 7. , "Minimum number of points used to mesh a circle" }, @@ -784,15 +784,15 @@ StringXNumber MeshOptions_Number[] = { "Display size of normal vectors (in pixels)" }, { F|O, "Points" , opt_mesh_points , 1. , - "Display mesh vertices?" }, + "Display mesh vertices (nodes)?" }, { F|O, "PointInsertion" , opt_mesh_point_insertion, CENTER_CIRCCIRC , - "Point insertion method for isotropic 2D algorithm (1=center of circumscribed circle, 2=voronoi, 3=cog)" }, - { F|O, "PointsNumbers" , opt_mesh_points_num , 0. , - "Display mesh vertex numbers?" }, + "Point insertion method for isotropic 2D algorithm (1=center of circumscribed circle, 2=cog)" }, + { F|O, "PointNumbers" , opt_mesh_points_num , 0. , + "Display mesh node numbers?" }, { F|O, "PointSize" , opt_mesh_point_size , 3. , - "Display size of points (in pixels)" }, + "Display size of mesh vertices (in pixels)" }, { F|O, "PointType" , opt_mesh_point_type , 0. , - "Display points as solid color dots (0) or 3D spheres (1)" }, + "Display mesh vertices as solid color dots (0) or 3D spheres (1)" }, { F|O, "Quality" , opt_mesh_quality , 0.0 , "Target quality for tetrahedral elements (not fully functional)" }, @@ -814,18 +814,22 @@ StringXNumber MeshOptions_Number[] = { "Draw mesh as solid (1) or wireframe (0)?" }, { F|O, "SpeedMax" , opt_mesh_speed_max , 0. , "Disable dubious point insertion tests" }, - { F|O, "Surfaces" , opt_mesh_surfaces , 1. , - "Display surface mesh?" }, - { F|O, "SurfacesNumbers" , opt_mesh_surfaces_num , 0. , - "Display mesh surface numbers?" }, + { F|O, "SurfaceEdges" , opt_mesh_surfaces_edges , 1. , + "Display edges of surface mesh?" }, + { F|O, "SurfaceFaces" , opt_mesh_surfaces_faces , 1. , + "Display faces of surface mesh?" }, + { F|O, "SurfaceNumbers" , opt_mesh_surfaces_num , 0. , + "Display surface mesh element numbers?" }, { F|O, "Tangents" , opt_mesh_tangents , 0.0 , "Display size of tangent vectors (in pixels)" }, - { F|O, "Volumes" , opt_mesh_volumes , 1. , - "Display volume mesh?" }, - { F|O, "VolumesNumbers" , opt_mesh_volumes_num , 0. , - "Display mesh elements numbers?" }, + { F|O, "VolumeEdges" , opt_mesh_volumes_edges , 1. , + "Display edges of volume mesh?" }, + { F|O, "VolumeFaces" , opt_mesh_volumes_faces , 0. , + "Display faces of volume mesh?" }, + { F|O, "VolumeNumbers" , opt_mesh_volumes_num , 0. , + "Display volume mesh element numbers?" }, { 0, NULL , NULL , 0. , NULL } } ; @@ -905,7 +909,7 @@ StringXNumber ViewOptions_Number[] = { { F|O, "ArrowHeadRadius" , opt_view_arrow_head_radius , 0.12 , "Relative radius of arrow head" }, { F|O, "ArrowLocation" , opt_view_arrow_location , DRAW_POST_LOCATE_COG , - "Arrow location (1=cog, 2=vertex)" }, + "Arrow location (1=cog, 2=node)" }, { F|O, "ArrowSize" , opt_view_arrow_size , 50. , "Display size of arrows (in pixels)" }, { F|O, "ArrowStemLength" , opt_view_arrow_stem_length , 0.56 , @@ -1204,12 +1208,12 @@ StringXColor MeshOptions_Color[] = { PACK_COLOR(0 , 200, 70 , 255), PACK_COLOR(0 , 200, 70 , 255), PACK_COLOR(0, 0, 0, 255), - "Mesh vertex color" }, + "Mesh node color" }, { F|O, "PointsSup" , opt_mesh_color_points_deg2 , PACK_COLOR(255, 0, 255 , 255), PACK_COLOR(255, 0, 255 , 255), PACK_COLOR(0, 0, 0, 255), - "Second order mesh vertex color" }, + "Second order mesh node color" }, { F|O, "Lines" , opt_mesh_color_lines , PACK_COLOR(0, 255, 0, 255), PACK_COLOR(0, 255, 0, 255), diff --git a/Common/Options.cpp b/Common/Options.cpp index 97aa302a7ffcc61b44318c307e9037c0bfd3d7f8..024b892831dfa4b3a2cb30bf08ab22e22825a7f9 100644 --- a/Common/Options.cpp +++ b/Common/Options.cpp @@ -1,4 +1,4 @@ -// $Id: Options.cpp,v 1.144 2004-04-18 06:48:23 geuzaine Exp $ +// $Id: Options.cpp,v 1.145 2004-04-19 21:59:14 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -3191,30 +3191,56 @@ double opt_mesh_lines(OPT_ARGS_NUM) return CTX.mesh.lines; } -double opt_mesh_surfaces(OPT_ARGS_NUM) +double opt_mesh_surfaces_edges(OPT_ARGS_NUM) { if(action & GMSH_SET) { - CTX.mesh.surfaces = (int)val; + CTX.mesh.surfaces_edges = (int)val; CTX.mesh.changed = 1; } #if defined(HAVE_FLTK) if(WID && (action & GMSH_GUI)) - WID->mesh_butt[8]->value(CTX.mesh.surfaces); + WID->mesh_butt[8]->value(CTX.mesh.surfaces_edges); #endif - return CTX.mesh.surfaces; + return CTX.mesh.surfaces_edges; } -double opt_mesh_volumes(OPT_ARGS_NUM) +double opt_mesh_surfaces_faces(OPT_ARGS_NUM) { if(action & GMSH_SET) { - CTX.mesh.volumes = (int)val; + CTX.mesh.surfaces_faces = (int)val; CTX.mesh.changed = 1; } #if defined(HAVE_FLTK) if(WID && (action & GMSH_GUI)) - WID->mesh_butt[9]->value(CTX.mesh.volumes); + WID->mesh_butt[9]->value(CTX.mesh.surfaces_faces); #endif - return CTX.mesh.volumes; + return CTX.mesh.surfaces_faces; +} + +double opt_mesh_volumes_edges(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) { + CTX.mesh.volumes_edges = (int)val; + CTX.mesh.changed = 1; + } +#if defined(HAVE_FLTK) + if(WID && (action & GMSH_GUI)) + WID->mesh_butt[10]->value(CTX.mesh.volumes_edges); +#endif + return CTX.mesh.volumes_edges; +} + +double opt_mesh_volumes_faces(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) { + CTX.mesh.volumes_faces = (int)val; + CTX.mesh.changed = 1; + } +#if defined(HAVE_FLTK) + if(WID && (action & GMSH_GUI)) + WID->mesh_butt[11]->value(CTX.mesh.volumes_faces); +#endif + return CTX.mesh.volumes_faces; } double opt_mesh_points_num(OPT_ARGS_NUM) @@ -3225,7 +3251,7 @@ double opt_mesh_points_num(OPT_ARGS_NUM) } #if defined(HAVE_FLTK) if(WID && (action & GMSH_GUI)) - WID->mesh_butt[10]->value(CTX.mesh.points_num); + WID->mesh_butt[12]->value(CTX.mesh.points_num); #endif return CTX.mesh.points_num; } @@ -3238,7 +3264,7 @@ double opt_mesh_lines_num(OPT_ARGS_NUM) } #if defined(HAVE_FLTK) if(WID && (action & GMSH_GUI)) - WID->mesh_butt[11]->value(CTX.mesh.lines_num); + WID->mesh_butt[13]->value(CTX.mesh.lines_num); #endif return CTX.mesh.lines_num; } @@ -3251,7 +3277,7 @@ double opt_mesh_surfaces_num(OPT_ARGS_NUM) } #if defined(HAVE_FLTK) if(WID && (action & GMSH_GUI)) - WID->mesh_butt[12]->value(CTX.mesh.surfaces_num); + WID->mesh_butt[14]->value(CTX.mesh.surfaces_num); #endif return CTX.mesh.surfaces_num; } @@ -3264,7 +3290,7 @@ double opt_mesh_volumes_num(OPT_ARGS_NUM) } #if defined(HAVE_FLTK) if(WID && (action & GMSH_GUI)) - WID->mesh_butt[13]->value(CTX.mesh.volumes_num); + WID->mesh_butt[15]->value(CTX.mesh.volumes_num); #endif return CTX.mesh.volumes_num; } @@ -3331,7 +3357,7 @@ double opt_mesh_solid(OPT_ARGS_NUM) } #if defined(HAVE_FLTK) if(WID && (action & GMSH_GUI)) - WID->mesh_butt[14]->value(CTX.mesh.solid); + WID->mesh_butt[16]->value(CTX.mesh.solid); #endif return CTX.mesh.solid; } @@ -3342,7 +3368,7 @@ double opt_mesh_light(OPT_ARGS_NUM) CTX.mesh.light = (int)val; #if defined(HAVE_FLTK) if(WID && (action & GMSH_GUI)) - WID->mesh_butt[15]->value(CTX.mesh.light); + WID->mesh_butt[17]->value(CTX.mesh.light); #endif return CTX.mesh.light; } @@ -3531,10 +3557,10 @@ double opt_mesh_color_carousel(OPT_ARGS_NUM) } #if defined(HAVE_FLTK) if(WID && (action & GMSH_GUI)){ - WID->mesh_butt[17]->value(CTX.mesh.color_carousel==0); - WID->mesh_butt[18]->value(CTX.mesh.color_carousel==1); - WID->mesh_butt[19]->value(CTX.mesh.color_carousel==2); - WID->mesh_butt[20]->value(CTX.mesh.color_carousel==3); + WID->mesh_butt[18]->value(CTX.mesh.color_carousel==0); + WID->mesh_butt[19]->value(CTX.mesh.color_carousel==1); + WID->mesh_butt[20]->value(CTX.mesh.color_carousel==2); + WID->mesh_butt[21]->value(CTX.mesh.color_carousel==3); } #endif return CTX.mesh.color_carousel; diff --git a/Common/Options.h b/Common/Options.h index bdc358a44918d0af949c3fba2151d2290d2d8991..15872fae86e2897b30aa8540c2083b3f8cc9b189 100644 --- a/Common/Options.h +++ b/Common/Options.h @@ -351,8 +351,10 @@ double opt_mesh_radius_inf(OPT_ARGS_NUM); double opt_mesh_radius_sup(OPT_ARGS_NUM); double opt_mesh_points(OPT_ARGS_NUM); double opt_mesh_lines(OPT_ARGS_NUM); -double opt_mesh_surfaces(OPT_ARGS_NUM); -double opt_mesh_volumes(OPT_ARGS_NUM); +double opt_mesh_surfaces_edges(OPT_ARGS_NUM); +double opt_mesh_surfaces_faces(OPT_ARGS_NUM); +double opt_mesh_volumes_edges(OPT_ARGS_NUM); +double opt_mesh_volumes_faces(OPT_ARGS_NUM); double opt_mesh_points_num(OPT_ARGS_NUM); double opt_mesh_lines_num(OPT_ARGS_NUM); double opt_mesh_surfaces_num(OPT_ARGS_NUM); diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp index 8d50d01b8e0b2e9567bddb58818ab57a931b9729..2f4bd343b67ca73128977d31182b89f96334f255 100644 --- a/Fltk/Callbacks.cpp +++ b/Fltk/Callbacks.cpp @@ -1,4 +1,4 @@ -// $Id: Callbacks.cpp,v 1.214 2004-04-18 21:47:29 geuzaine Exp $ +// $Id: Callbacks.cpp,v 1.215 2004-04-19 21:59:14 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -1079,18 +1079,20 @@ void mesh_options_ok_cb(CALLBACK_ARGS) opt_mesh_constrained_bgmesh(0, GMSH_SET, WID->mesh_butt[5]->value()); opt_mesh_points(0, GMSH_SET, WID->mesh_butt[6]->value()); opt_mesh_lines(0, GMSH_SET, WID->mesh_butt[7]->value()); - opt_mesh_surfaces(0, GMSH_SET, WID->mesh_butt[8]->value()); - opt_mesh_volumes(0, GMSH_SET, WID->mesh_butt[9]->value()); - opt_mesh_points_num(0, GMSH_SET, WID->mesh_butt[10]->value()); - opt_mesh_lines_num(0, GMSH_SET, WID->mesh_butt[11]->value()); - opt_mesh_surfaces_num(0, GMSH_SET, WID->mesh_butt[12]->value()); - opt_mesh_volumes_num(0, GMSH_SET, WID->mesh_butt[13]->value()); - opt_mesh_solid(0, GMSH_SET, WID->mesh_butt[14]->value()); - opt_mesh_light(0, GMSH_SET, WID->mesh_butt[15]->value()); + opt_mesh_surfaces_edges(0, GMSH_SET, WID->mesh_butt[8]->value()); + opt_mesh_surfaces_faces(0, GMSH_SET, WID->mesh_butt[9]->value()); + opt_mesh_volumes_edges(0, GMSH_SET, WID->mesh_butt[10]->value()); + opt_mesh_volumes_faces(0, GMSH_SET, WID->mesh_butt[11]->value()); + opt_mesh_points_num(0, GMSH_SET, WID->mesh_butt[12]->value()); + opt_mesh_lines_num(0, GMSH_SET, WID->mesh_butt[13]->value()); + opt_mesh_surfaces_num(0, GMSH_SET, WID->mesh_butt[14]->value()); + opt_mesh_volumes_num(0, GMSH_SET, WID->mesh_butt[15]->value()); + opt_mesh_solid(0, GMSH_SET, WID->mesh_butt[16]->value()); + opt_mesh_light(0, GMSH_SET, WID->mesh_butt[17]->value()); opt_mesh_color_carousel(0, GMSH_SET, - WID->mesh_butt[17]->value()? 0 : - WID->mesh_butt[18]->value()? 1 : - WID->mesh_butt[19]->value()? 2 : + WID->mesh_butt[18]->value()? 0 : + WID->mesh_butt[19]->value()? 1 : + WID->mesh_butt[20]->value()? 2 : 3); opt_mesh_nb_smoothing(0, GMSH_SET, WID->mesh_value[0]->value()); diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp index 16c147a205dc83b71ea43859ccccce36ac9d1335..68d660371c108e7b6b9ffaf3c806c3e6bf6a2322 100644 --- a/Fltk/GUI.cpp +++ b/Fltk/GUI.cpp @@ -1,4 +1,4 @@ -// $Id: GUI.cpp,v 1.283 2004-04-18 21:47:29 geuzaine Exp $ +// $Id: GUI.cpp,v 1.284 2004-04-19 21:59:14 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -623,24 +623,28 @@ int GUI::global_shortcuts(int event) return 1; } else if(Fl::test_shortcut(FL_ALT + FL_SHIFT + 's')) { - opt_mesh_surfaces(0, GMSH_SET | GMSH_GUI, - !opt_mesh_surfaces(0, GMSH_GET, 0)); + int old = opt_mesh_surfaces_edges(0, GMSH_GET, 0) || opt_mesh_surfaces_faces(0, GMSH_GET, 0); + opt_mesh_surfaces_edges(0, GMSH_SET | GMSH_GUI, !old); + opt_mesh_surfaces_faces(0, GMSH_SET | GMSH_GUI, !old); redraw_opengl(); return 1; } else if(Fl::test_shortcut(FL_ALT + FL_SHIFT + 'v')) { - opt_mesh_volumes(0, GMSH_SET | GMSH_GUI, - !opt_mesh_volumes(0, GMSH_GET, 0)); + int old = opt_mesh_volumes_edges(0, GMSH_GET, 0) || opt_mesh_volumes_faces(0, GMSH_GET, 0); + opt_mesh_volumes_edges(0, GMSH_SET | GMSH_GUI, !old); + opt_mesh_volumes_faces(0, GMSH_SET | GMSH_GUI, !old); redraw_opengl(); return 1; } else if(Fl::test_shortcut(FL_ALT + 'm')) { - opt_mesh_points(0, GMSH_SET | GMSH_GUI, !opt_mesh_points(0, GMSH_GET, 0)); - opt_mesh_lines(0, GMSH_SET | GMSH_GUI, !opt_mesh_lines(0, GMSH_GET, 0)); - opt_mesh_surfaces(0, GMSH_SET | GMSH_GUI, - !opt_mesh_surfaces(0, GMSH_GET, 0)); - opt_mesh_volumes(0, GMSH_SET | GMSH_GUI, - !opt_mesh_volumes(0, GMSH_GET, 0)); + int old = opt_mesh_points(0, GMSH_GET, 0) || opt_mesh_lines(0, GMSH_GET, 0) || + opt_mesh_surfaces_edges(0, GMSH_GET, 0) || opt_mesh_surfaces_faces(0, GMSH_GET, 0); + opt_mesh_points(0, GMSH_SET | GMSH_GUI, !old); + opt_mesh_lines(0, GMSH_SET | GMSH_GUI, !old); + opt_mesh_surfaces_edges(0, GMSH_SET | GMSH_GUI, !old); + opt_mesh_surfaces_faces(0, GMSH_SET | GMSH_GUI, !old); + opt_mesh_volumes_edges(0, GMSH_SET | GMSH_GUI, !old); + opt_mesh_volumes_faces(0, GMSH_SET | GMSH_GUI, !old); redraw_opengl(); return 1; } @@ -1798,32 +1802,34 @@ 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, "Points"); - mesh_butt[7] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Lines"); - mesh_butt[8] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Surfaces"); - mesh_butt[9] = new Fl_Check_Button(2 * WB, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Volumes"); - mesh_butt[10] = new Fl_Check_Button(width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Point numbers"); - mesh_butt[11] = new Fl_Check_Button(width / 2, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Line numbers"); - mesh_butt[12] = new Fl_Check_Button(width / 2, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Surface numbers"); - mesh_butt[13] = new Fl_Check_Button(width / 2, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Volume numbers"); - for(i = 6; i < 14; i++) { + mesh_butt[6] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Nodes"); + mesh_butt[7] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Line elements"); + mesh_butt[8] = new Fl_Check_Button(2 * WB, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Surface element edges"); + mesh_butt[9] = new Fl_Check_Button(2 * WB, 2 * WB + 4 * BH, BW / 2 - WB, BH, "Surface element faces"); + mesh_butt[10] = new Fl_Check_Button(2 * WB, 2 * WB + 5 * BH, BW / 2 - WB, BH, "Volume element edges"); + mesh_butt[11] = new Fl_Check_Button(2 * WB, 2 * WB + 6 * BH, BW / 2 - WB, BH, "Volume element faces"); + mesh_butt[12] = new Fl_Check_Button(width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Node numbers"); + mesh_butt[13] = new Fl_Check_Button(width / 2, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Line element numbers"); + mesh_butt[14] = new Fl_Check_Button(width / 2, 2 * WB + 3 * BH, BW / 2 - WB, BH, "Surface element numbers"); + 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_value[4] = new Fl_Value_Input(2 * WB, 2 * WB + 5 * BH, IW / 2, BH); + 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 + 5 * BH, IW / 2, BH, "Quality range"); + mesh_value[5] = new Fl_Value_Input(2 * WB + IW / 2, 2 * WB + 7 * BH, IW / 2, BH, "Quality range"); mesh_value[5]->minimum(0); mesh_value[5]->maximum(1); mesh_value[5]->step(0.001); - mesh_value[6] = new Fl_Value_Input(2 * WB, 2 * WB + 6 * BH, IW / 2, BH); - mesh_value[7] = new Fl_Value_Input(2 * WB + IW / 2, 2 * WB + 6 * BH, IW / 2, BH, "Size range"); + 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[8] = new Fl_Value_Input(2 * WB, 2 * WB + 7 * BH, IW, BH, "Normals"); + 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); @@ -1831,7 +1837,7 @@ void GUI::create_option_window() mesh_value[i]->align(FL_ALIGN_RIGHT); } - mesh_value[13] = new Fl_Value_Input(2 * WB, 2 * WB + 8 * BH, IW, BH, "Tangents"); + mesh_value[13] = new Fl_Value_Input(2 * WB, 2 * WB + 10 * BH, IW, BH, "Tangents"); mesh_value[13]->minimum(0); mesh_value[13]->maximum(200); mesh_value[13]->step(1.0); @@ -1842,9 +1848,9 @@ 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[14] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW, BH, "Draw as solid (hidden surfaces)"); - mesh_butt[15] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW, BH, "Enable lighting"); - for(i = 14; i < 16; i++) { + mesh_butt[16] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW, BH, "Draw as solid (hidden surfaces)"); + mesh_butt[17] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW, BH, "Enable lighting"); + for(i = 16; i < 18; i++) { mesh_butt[i]->type(FL_TOGGLE_BUTTON); mesh_butt[i]->down_box(TOGGLE_BOX); mesh_butt[i]->selection_color(TOGGLE_COLOR); @@ -1880,11 +1886,11 @@ void GUI::create_option_window() { Fl_Group *o = new Fl_Group(WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Colors"); o->hide(); - mesh_butt[17] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Color by element type"); - mesh_butt[18] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Color by elementary entity"); - mesh_butt[19] = new Fl_Check_Button(width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Color by physical entity"); - mesh_butt[20] = new Fl_Check_Button(width / 2, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Color by partition"); - for(i = 17; i < 21; i++) { + mesh_butt[18] = new Fl_Check_Button(2 * WB, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Color by element type"); + mesh_butt[19] = new Fl_Check_Button(2 * WB, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Color by elementary entity"); + mesh_butt[20] = new Fl_Check_Button(width / 2, 2 * WB + 1 * BH, BW / 2 - WB, BH, "Color by physical entity"); + mesh_butt[21] = new Fl_Check_Button(width / 2, 2 * WB + 2 * BH, BW / 2 - WB, BH, "Color by partition"); + for(i = 18; i < 22; i++) { mesh_butt[i]->type(FL_RADIO_BUTTON); mesh_butt[i]->down_box(RADIO_BOX); mesh_butt[i]->selection_color(RADIO_COLOR); diff --git a/Graphics/Mesh.cpp b/Graphics/Mesh.cpp index 9e00098564b31003b6dd6a95b63b8a28839c233b..8ed97290398d33a2e782cb786dac1f015f040c1b 100644 --- a/Graphics/Mesh.cpp +++ b/Graphics/Mesh.cpp @@ -1,4 +1,4 @@ -// $Id: Mesh.cpp,v 1.69 2004-04-19 19:04:15 geuzaine Exp $ +// $Id: Mesh.cpp,v 1.70 2004-04-19 21:59:14 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -144,11 +144,13 @@ void Draw_Mesh(Mesh * M) //printf("normal mesh drawing\n"); - if(M->status >= 3 && (CTX.mesh.volumes || CTX.mesh.volumes_num)) { + if(M->status >= 3 && (CTX.mesh.volumes_faces || CTX.mesh.volumes_edges || + CTX.mesh.volumes_num)) { Tree_Action(M->Volumes, Draw_Mesh_Volumes); } - if(M->status >= 2 && (CTX.mesh.surfaces || CTX.mesh.surfaces_num)) { + if(M->status >= 2 && (CTX.mesh.surfaces_faces || CTX.mesh.surfaces_edges || + CTX.mesh.surfaces_num)) { Tree_Action(M->Surfaces, Draw_Mesh_Surfaces); if(CTX.mesh.oldxtrude) //old extrusion algo Tree_Action(M->Volumes, Draw_Mesh_Extruded_Surfaces); @@ -318,7 +320,6 @@ void Draw_Simplex_Volume(void *a, void *b) { Simplex *s; char Num[100]; - int fulldraw = 0; double tmp, X[4], Y[4], Z[4], X2[6], Y2[6], Z2[6]; s = *(Simplex **) a; @@ -345,13 +346,11 @@ void Draw_Simplex_Volume(void *a, void *b) tmp = s->GammaShapeMeasure(); if(tmp < CTX.mesh.gamma_inf || tmp > CTX.mesh.gamma_sup) return; - fulldraw = 1; } if(CTX.mesh.radius_sup) { if(s->Radius < CTX.mesh.radius_inf || s->Radius > CTX.mesh.radius_sup) return; - fulldraw = 1; } double Xc = .25 * (s->V[0]->Pos.X + s->V[1]->Pos.X + @@ -364,10 +363,9 @@ void Draw_Simplex_Volume(void *a, void *b) if(CTX.mesh.use_cut_plane) { if(CTX.mesh.evalCutPlane(Xc, Yc, Zc) < 0) return; - fulldraw = 1; } - if(!fulldraw){ + if(!CTX.mesh.solid){ if(theColor.type) glColor4ubv((GLubyte *) & theColor.mesh); else if(CTX.mesh.color_carousel == 1) @@ -395,7 +393,7 @@ void Draw_Simplex_Volume(void *a, void *b) } } - if(CTX.mesh.volumes) { + if(CTX.mesh.volumes_edges) { if(!s->VSUP){ glBegin(GL_LINES); glVertex3d(X[0], Y[0], Z[0]); glVertex3d(X[1], Y[1], Z[1]); @@ -458,21 +456,18 @@ void Draw_Simplex_Volume(void *a, void *b) gl2psDisable(GL2PS_LINE_STIPPLE); } - if(!fulldraw) - return; - - if(theColor.type) - glColor4ubv((GLubyte *) & theColor.mesh); - else if(CTX.mesh.color_carousel == 1) - ColorSwitch(s->iEnt); - else if(CTX.mesh.color_carousel == 2) - ColorSwitch(thePhysical); - else if(CTX.mesh.color_carousel == 3) - ColorSwitch(s->iPart); - else - glColor4ubv((GLubyte *) & CTX.color.mesh.tetrahedron); + if(CTX.mesh.volumes_faces && CTX.mesh.solid){ + if(theColor.type) + glColor4ubv((GLubyte *) & theColor.mesh); + else if(CTX.mesh.color_carousel == 1) + ColorSwitch(s->iEnt); + else if(CTX.mesh.color_carousel == 2) + ColorSwitch(thePhysical); + else if(CTX.mesh.color_carousel == 3) + ColorSwitch(s->iPart); + else + glColor4ubv((GLubyte *) & CTX.color.mesh.tetrahedron); - if(CTX.mesh.solid) { double n[3]; // FIXME: should subdivide if s->VSUP if(CTX.mesh.light) glEnable(GL_LIGHTING); @@ -509,23 +504,25 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY, if(CTX.mesh.normals || CTX.mesh.light) glNormal3verts(s->V[0], s->V[1], s->V[2], n); - if(CTX.mesh.surfaces && CTX.mesh.lines) { - if(!CTX.mesh.solid) { - if(theColor.type) - glColor4ubv((GLubyte *) & theColor.mesh); - else if(CTX.mesh.color_carousel == 1) - ColorSwitch(s->iEnt); - else if(CTX.mesh.color_carousel == 2) - ColorSwitch(thePhysical); - else if(CTX.mesh.color_carousel == 3) - ColorSwitch(s->iPart); - else - glColor4ubv((GLubyte *) & CTX.color.mesh.line); - } - else { - glColor4ubv((GLubyte *) & CTX.color.mesh.line); - } + if(!CTX.mesh.solid){ + if(theColor.type) + glColor4ubv((GLubyte *) & theColor.mesh); + else if(CTX.mesh.color_carousel == 1) + ColorSwitch(s->iEnt); + else if(CTX.mesh.color_carousel == 2) + ColorSwitch(thePhysical); + else if(CTX.mesh.color_carousel == 3) + ColorSwitch(s->iPart); + else if(K == 3) + glColor4ubv((GLubyte *) & CTX.color.mesh.triangle); + else + glColor4ubv((GLubyte *) & CTX.color.mesh.quadrangle); + } + else { + glColor4ubv((GLubyte *) & CTX.color.mesh.line); + } + if(CTX.mesh.surfaces_edges){ if(pX && pY && pZ) { // using precomputed vertices glBegin(GL_LINE_LOOP); for(i = 0; i < K * (1 + L); i++) { @@ -550,23 +547,22 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY, glEnd(); } } - } - if(theColor.type) - glColor4ubv((GLubyte *) & theColor.mesh); - else if(CTX.mesh.color_carousel == 1) - ColorSwitch(s->iEnt); - else if(CTX.mesh.color_carousel == 2) - ColorSwitch(thePhysical); - else if(CTX.mesh.color_carousel == 3) - ColorSwitch(s->iPart); - else if(K == 3) - glColor4ubv((GLubyte *) & CTX.color.mesh.triangle); - else - glColor4ubv((GLubyte *) & CTX.color.mesh.quadrangle); + if(CTX.mesh.surfaces_faces && CTX.mesh.solid) { - if(CTX.mesh.surfaces && CTX.mesh.solid) { + if(theColor.type) + glColor4ubv((GLubyte *) & theColor.mesh); + else if(CTX.mesh.color_carousel == 1) + ColorSwitch(s->iEnt); + else if(CTX.mesh.color_carousel == 2) + ColorSwitch(thePhysical); + else if(CTX.mesh.color_carousel == 3) + ColorSwitch(s->iPart); + else if(K == 3) + glColor4ubv((GLubyte *) & CTX.color.mesh.triangle); + else + glColor4ubv((GLubyte *) & CTX.color.mesh.quadrangle); if(CTX.mesh.light) glEnable(GL_LIGHTING); @@ -902,16 +898,20 @@ void Draw_Hexahedron_Volume(void *a, void *b) return; } - if(theColor.type) - glColor4ubv((GLubyte *) & theColor.mesh); - else if(CTX.mesh.color_carousel == 1) - ColorSwitch(h->iEnt); - else if(CTX.mesh.color_carousel == 2) - ColorSwitch(thePhysical); - else if(CTX.mesh.color_carousel == 3) - ColorSwitch(h->iPart); + if(!CTX.mesh.solid){ + if(theColor.type) + glColor4ubv((GLubyte *) & theColor.mesh); + else if(CTX.mesh.color_carousel == 1) + ColorSwitch(h->iEnt); + else if(CTX.mesh.color_carousel == 2) + ColorSwitch(thePhysical); + else if(CTX.mesh.color_carousel == 3) + ColorSwitch(h->iPart); + else + glColor4ubv((GLubyte *) & CTX.color.mesh.hexahedron); + } else - glColor4ubv((GLubyte *) & CTX.color.mesh.hexahedron); + glColor4ubv((GLubyte *) & CTX.color.mesh.line); for(i = 0; i < 8; i++) { X[i] = Xc + CTX.mesh.explode * (h->V[i]->Pos.X - Xc); @@ -919,30 +919,31 @@ void Draw_Hexahedron_Volume(void *a, void *b) Z[i] = Zc + CTX.mesh.explode * (h->V[i]->Pos.Z - Zc); } - glBegin(GL_LINE_LOOP); - glVertex3d(X[0], Y[0], Z[0]); - glVertex3d(X[1], Y[1], Z[1]); - glVertex3d(X[2], Y[2], Z[2]); - glVertex3d(X[3], Y[3], Z[3]); - glEnd(); - - glBegin(GL_LINE_LOOP); - glVertex3d(X[4], Y[4], Z[4]); - glVertex3d(X[5], Y[5], Z[5]); - glVertex3d(X[6], Y[6], Z[6]); - glVertex3d(X[7], Y[7], Z[7]); - glEnd(); - - glBegin(GL_LINES); - glVertex3d(X[0], Y[0], Z[0]); - glVertex3d(X[4], Y[4], Z[4]); - glVertex3d(X[1], Y[1], Z[1]); - glVertex3d(X[5], Y[5], Z[5]); - glVertex3d(X[2], Y[2], Z[2]); - glVertex3d(X[6], Y[6], Z[6]); - glVertex3d(X[3], Y[3], Z[3]); - glVertex3d(X[7], Y[7], Z[7]); - glEnd(); + // FIXME: remove "1" when we add the face drawing code + if(1 || CTX.mesh.volumes_edges){ + glBegin(GL_LINE_LOOP); + glVertex3d(X[0], Y[0], Z[0]); + glVertex3d(X[1], Y[1], Z[1]); + glVertex3d(X[2], Y[2], Z[2]); + glVertex3d(X[3], Y[3], Z[3]); + glEnd(); + glBegin(GL_LINE_LOOP); + glVertex3d(X[4], Y[4], Z[4]); + glVertex3d(X[5], Y[5], Z[5]); + glVertex3d(X[6], Y[6], Z[6]); + glVertex3d(X[7], Y[7], Z[7]); + glEnd(); + glBegin(GL_LINES); + glVertex3d(X[0], Y[0], Z[0]); + glVertex3d(X[4], Y[4], Z[4]); + glVertex3d(X[1], Y[1], Z[1]); + glVertex3d(X[5], Y[5], Z[5]); + glVertex3d(X[2], Y[2], Z[2]); + glVertex3d(X[6], Y[6], Z[6]); + glVertex3d(X[3], Y[3], Z[3]); + glVertex3d(X[7], Y[7], Z[7]); + glEnd(); + } if(CTX.mesh.volumes_num) { sprintf(Num, "%d", h->Num); @@ -951,7 +952,6 @@ void Draw_Hexahedron_Volume(void *a, void *b) } if(CTX.mesh.dual) { - glColor4ubv((GLubyte *) & CTX.color.fg); glEnable(GL_LINE_STIPPLE); glLineStipple(1, 0x0F0F); @@ -1052,16 +1052,20 @@ void Draw_Prism_Volume(void *a, void *b) return; } - if(theColor.type) - glColor4ubv((GLubyte *) & theColor.mesh); - else if(CTX.mesh.color_carousel == 1) - ColorSwitch(p->iEnt); - else if(CTX.mesh.color_carousel == 2) - ColorSwitch(thePhysical); - else if(CTX.mesh.color_carousel == 3) - ColorSwitch(p->iPart); + if(!CTX.mesh.solid){ + if(theColor.type) + glColor4ubv((GLubyte *) & theColor.mesh); + else if(CTX.mesh.color_carousel == 1) + ColorSwitch(p->iEnt); + else if(CTX.mesh.color_carousel == 2) + ColorSwitch(thePhysical); + else if(CTX.mesh.color_carousel == 3) + ColorSwitch(p->iPart); + else + glColor4ubv((GLubyte *) & CTX.color.mesh.prism); + } else - glColor4ubv((GLubyte *) & CTX.color.mesh.prism); + glColor4ubv((GLubyte *) & CTX.color.mesh.line); for(i = 0; i < 6; i++) { X[i] = Xc + CTX.mesh.explode * (p->V[i]->Pos.X - Xc); @@ -1069,26 +1073,27 @@ void Draw_Prism_Volume(void *a, void *b) Z[i] = Zc + CTX.mesh.explode * (p->V[i]->Pos.Z - Zc); } - glBegin(GL_LINE_LOOP); - glVertex3d(X[0], Y[0], Z[0]); - glVertex3d(X[1], Y[1], Z[1]); - glVertex3d(X[2], Y[2], Z[2]); - glEnd(); - - glBegin(GL_LINE_LOOP); - glVertex3d(X[3], Y[3], Z[3]); - glVertex3d(X[4], Y[4], Z[4]); - glVertex3d(X[5], Y[5], Z[5]); - glEnd(); - - glBegin(GL_LINES); - glVertex3d(X[0], Y[0], Z[0]); - glVertex3d(X[3], Y[3], Z[3]); - glVertex3d(X[1], Y[1], Z[1]); - glVertex3d(X[4], Y[4], Z[4]); - glVertex3d(X[2], Y[2], Z[2]); - glVertex3d(X[5], Y[5], Z[5]); - glEnd(); + // FIXME: remove "1" when we add the face drawing code + if(1 || CTX.mesh.volumes_edges){ + glBegin(GL_LINE_LOOP); + glVertex3d(X[0], Y[0], Z[0]); + glVertex3d(X[1], Y[1], Z[1]); + glVertex3d(X[2], Y[2], Z[2]); + glEnd(); + glBegin(GL_LINE_LOOP); + glVertex3d(X[3], Y[3], Z[3]); + glVertex3d(X[4], Y[4], Z[4]); + glVertex3d(X[5], Y[5], Z[5]); + glEnd(); + glBegin(GL_LINES); + glVertex3d(X[0], Y[0], Z[0]); + glVertex3d(X[3], Y[3], Z[3]); + glVertex3d(X[1], Y[1], Z[1]); + glVertex3d(X[4], Y[4], Z[4]); + glVertex3d(X[2], Y[2], Z[2]); + glVertex3d(X[5], Y[5], Z[5]); + glEnd(); + } if(CTX.mesh.volumes_num) { sprintf(Num, "%d", p->Num); @@ -1183,16 +1188,20 @@ void Draw_Pyramid_Volume(void *a, void *b) return; } - if(theColor.type) - glColor4ubv((GLubyte *) & theColor.mesh); - else if(CTX.mesh.color_carousel == 1) - ColorSwitch(p->iEnt); - else if(CTX.mesh.color_carousel == 2) - ColorSwitch(thePhysical); - else if(CTX.mesh.color_carousel == 3) - ColorSwitch(p->iPart); + if(!CTX.mesh.solid){ + if(theColor.type) + glColor4ubv((GLubyte *) & theColor.mesh); + else if(CTX.mesh.color_carousel == 1) + ColorSwitch(p->iEnt); + else if(CTX.mesh.color_carousel == 2) + ColorSwitch(thePhysical); + else if(CTX.mesh.color_carousel == 3) + ColorSwitch(p->iPart); + else + glColor4ubv((GLubyte *) & CTX.color.mesh.pyramid); + } else - glColor4ubv((GLubyte *) & CTX.color.mesh.pyramid); + glColor4ubv((GLubyte *) & CTX.color.mesh.line); for(i = 0; i < 5; i++) { X[i] = Xc + CTX.mesh.explode * (p->V[i]->Pos.X - Xc); @@ -1200,23 +1209,25 @@ void Draw_Pyramid_Volume(void *a, void *b) Z[i] = Zc + CTX.mesh.explode * (p->V[i]->Pos.Z - Zc); } - glBegin(GL_LINE_LOOP); - glVertex3d(X[0], Y[0], Z[0]); - glVertex3d(X[1], Y[1], Z[1]); - glVertex3d(X[2], Y[2], Z[2]); - glVertex3d(X[3], Y[3], Z[3]); - glEnd(); - - glBegin(GL_LINES); - glVertex3d(X[0], Y[0], Z[0]); - glVertex3d(X[4], Y[4], Z[4]); - glVertex3d(X[1], Y[1], Z[1]); - glVertex3d(X[4], Y[4], Z[4]); - glVertex3d(X[2], Y[2], Z[2]); - glVertex3d(X[4], Y[4], Z[4]); - glVertex3d(X[3], Y[3], Z[3]); - glVertex3d(X[4], Y[4], Z[4]); - glEnd(); + // FIXME: remove "1" when we add the face drawing code + if(1 || CTX.mesh.volumes_edges){ + glBegin(GL_LINE_LOOP); + glVertex3d(X[0], Y[0], Z[0]); + glVertex3d(X[1], Y[1], Z[1]); + glVertex3d(X[2], Y[2], Z[2]); + glVertex3d(X[3], Y[3], Z[3]); + glEnd(); + glBegin(GL_LINES); + glVertex3d(X[0], Y[0], Z[0]); + glVertex3d(X[4], Y[4], Z[4]); + glVertex3d(X[1], Y[1], Z[1]); + glVertex3d(X[4], Y[4], Z[4]); + glVertex3d(X[2], Y[2], Z[2]); + glVertex3d(X[4], Y[4], Z[4]); + glVertex3d(X[3], Y[3], Z[3]); + glVertex3d(X[4], Y[4], Z[4]); + glEnd(); + } if(CTX.mesh.volumes_num) { sprintf(Num, "%d", p->Num); diff --git a/doc/VERSIONS b/doc/VERSIONS index 8439a3c364a152d3b75b5b20c10025ea268eb9ea..aab19b008c7ae3db42f16b1e97ee65b02846bbc9 100644 --- a/doc/VERSIONS +++ b/doc/VERSIONS @@ -1,15 +1,16 @@ -$Id: VERSIONS,v 1.194 2004-04-19 16:42:52 geuzaine Exp $ +$Id: VERSIONS,v 1.195 2004-04-19 21:59:14 geuzaine Exp $ New in 1.52: new raster ("bitmap") PostScript/EPS/PDF output formats; new Plugin(Extract) to extract a given component from a post-processing view; improved mesh projection on non-planar surfaces; added support for second order tetrahedral elements; added interactive -control of element order; various bug fixes (default postscript -printing mode, drawing of 3D arrows/cylinders on Linux, default home -directory on Windows, default initial file browser directory, -extrusion of points with non-normalized axes of rotation, computation -of the scene bounding box in scripts, + the usual documentation -updates); +control of element order; refined mesh entity drawing selection (and +renamed most of the corresponding options); add fine grained control +various bug fixes (default postscript printing mode, drawing of 3D +arrows/cylinders on Linux, default home directory on Windows, default +initial file browser directory, extrusion of points with +non-normalized axes of rotation, computation of the scene bounding box +in scripts, + the usual documentation updates); New in 1.51: initial support for visualizing mesh partitions; integrated version 2.0 of the MSH mesh file format; new option to