From e1787affbce830d8b848077a68081edd4e2bb122 Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Fri, 7 Dec 2007 20:49:05 +0000 Subject: [PATCH] added new "Normal raise" --- Common/DefaultOptions.h | 2 ++ Common/Options.cpp | 16 ++++++++- Common/Options.h | 1 + Fltk/Callbacks.cpp | 7 +++- Fltk/GUI.cpp | 21 ++++++------ Graphics/Post.cpp | 72 ++++++++++++++++++++++++++++++----------- Post/PViewOptions.h | 3 +- 7 files changed, 91 insertions(+), 31 deletions(-) diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h index dccec3c36f..7bfec2f839 100644 --- a/Common/DefaultOptions.h +++ b/Common/DefaultOptions.h @@ -1291,6 +1291,8 @@ StringXNumber ViewOptions_Number[] = { "Number of intervals" }, { F, "NbTimeStep" , opt_view_nb_timestep , 1. , "Number of time steps in the view (do not change this!)" }, + { F, "NormalRaise" , opt_view_normal_raise , 0. , + "Elevation of the view along the normal (in model coordinates)" }, { F|O, "Normals" , opt_view_normals , 0. , "Display size of normal vectors (in pixels)" }, diff --git a/Common/Options.cpp b/Common/Options.cpp index e14f73524a..ef5a7be785 100644 --- a/Common/Options.cpp +++ b/Common/Options.cpp @@ -1,4 +1,4 @@ -// $Id: Options.cpp,v 1.370 2007-11-28 17:02:19 geuzaine Exp $ +// $Id: Options.cpp,v 1.371 2007-12-07 20:49:05 geuzaine Exp $ // // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle // @@ -5603,6 +5603,20 @@ double opt_view_raise2(OPT_ARGS_NUM) return opt->Raise[2]; } +double opt_view_normal_raise(OPT_ARGS_NUM) +{ + GET_VIEW(0.); + if(action & GMSH_SET) { + opt->NormalRaise = val; + if(view) view->setChanged(true); + } +#if defined(HAVE_FLTK) + if(_gui_action_valid(action, num)) + WID->view_value[46]->value(opt->NormalRaise); +#endif + return opt->NormalRaise; +} + double opt_view_transform00(OPT_ARGS_NUM) { GET_VIEW(0.); diff --git a/Common/Options.h b/Common/Options.h index aac39194c4..91d48d4bca 100644 --- a/Common/Options.h +++ b/Common/Options.h @@ -553,6 +553,7 @@ double opt_view_offset2(OPT_ARGS_NUM); double opt_view_raise0(OPT_ARGS_NUM); double opt_view_raise1(OPT_ARGS_NUM); double opt_view_raise2(OPT_ARGS_NUM); +double opt_view_normal_raise(OPT_ARGS_NUM); double opt_view_transform00(OPT_ARGS_NUM); double opt_view_transform01(OPT_ARGS_NUM); double opt_view_transform02(OPT_ARGS_NUM); diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp index 3e64e74a13..4a24da65d9 100644 --- a/Fltk/Callbacks.cpp +++ b/Fltk/Callbacks.cpp @@ -1,4 +1,4 @@ -// $Id: Callbacks.cpp,v 1.553 2007-11-28 14:18:09 remacle Exp $ +// $Id: Callbacks.cpp,v 1.554 2007-12-07 20:49:05 geuzaine Exp $ // // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle // @@ -1338,6 +1338,7 @@ void view_options_ok_cb(CALLBACK_ARGS) double raise0 = opt_view_raise0(current, GMSH_GET, 0); double raise1 = opt_view_raise1(current, GMSH_GET, 0); double raise2 = opt_view_raise2(current, GMSH_GET, 0); + double normal_raise = opt_view_normal_raise(current, GMSH_GET, 0); double timestep = opt_view_timestep(current, GMSH_GET, 0); double arrow_size = opt_view_arrow_size(current, GMSH_GET, 0); double arrow_size_proportional = opt_view_arrow_size_proportional(current, GMSH_GET, 0); @@ -1642,6 +1643,10 @@ void view_options_ok_cb(CALLBACK_ARGS) if(force || (val != raise2)) opt_view_raise2(i, GMSH_SET, val); + val = WID->view_value[46]->value(); + if(force || (val != normal_raise)) + opt_view_normal_raise(i, GMSH_SET, val); + val = WID->view_value[50]->value(); if(force || (val != timestep)) opt_view_timestep(i, GMSH_SET, val); diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp index c4282222c5..38e471cb3c 100644 --- a/Fltk/GUI.cpp +++ b/Fltk/GUI.cpp @@ -1,4 +1,4 @@ -// $Id: GUI.cpp,v 1.645 2007-11-28 14:18:10 remacle Exp $ +// $Id: GUI.cpp,v 1.646 2007-12-07 20:49:05 geuzaine Exp $ // // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle // @@ -3197,7 +3197,9 @@ void GUI::create_option_window() view_value[44] = new Fl_Value_Input(L + 2 * WB + 2 * IW-WB, 2 * WB + 3 * BH, 7*IW/10, BH, "Y"); view_value[45] = new Fl_Value_Input(L + 2 * WB + 2 * IW-WB, 2 * WB + 4 * BH, 7*IW/10, BH, "Z"); - for(int i = 40; i <= 45; i++){ + view_value[46] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 5 * BH, 3*ss, BH, "Normal raise"); + + for(int i = 40; i <= 46; i++){ view_value[i]->align(FL_ALIGN_RIGHT); view_value[i]->when(FL_WHEN_RELEASE); view_value[i]->callback(view_options_ok_cb); @@ -3211,29 +3213,29 @@ void GUI::create_option_window() view_value[i]->callback(view_options_ok_cb); } - view_butt[6] = new Fl_Check_Button(L + 2 * WB, 2 * WB + 5 * BH, BW, BH, "Use general transformation expressions"); + view_butt[6] = new Fl_Check_Button(L + 2 * WB, 2 * WB + 6 * BH, BW, BH, "Use general transformation expressions"); view_butt[6]->type(FL_TOGGLE_BUTTON); view_butt[6]->callback(view_options_ok_cb, (void*)"general_transform"); - view_choice[11] = new Fl_Choice(L + 2 * WB, 2 * WB + 6 * BH, IW, BH, "Data source"); + view_choice[11] = new Fl_Choice(L + 2 * WB, 2 * WB + 7 * BH, IW, BH, "Data source"); view_choice[11]->align(FL_ALIGN_RIGHT); view_choice[11]->add("Self"); view_choice[11]->callback(view_options_ok_cb); - view_value[2] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 7 * BH, IW, BH, "Factor"); + view_value[2] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 8 * BH, IW, BH, "Factor"); view_value[2]->align(FL_ALIGN_RIGHT); view_value[2]->when(FL_WHEN_RELEASE); view_value[2]->callback(view_options_ok_cb); - view_input[4] = new Fl_Input(L + 2 * WB, 2 * WB + 8 * BH, IW, BH, "X expression"); + view_input[4] = new Fl_Input(L + 2 * WB, 2 * WB + 9 * BH, IW, BH, "X expression"); view_input[4]->align(FL_ALIGN_RIGHT); view_input[4]->callback(view_options_ok_cb); - view_input[5] = new Fl_Input(L + 2 * WB, 2 * WB + 9 * BH, IW, BH, "Y expression"); + view_input[5] = new Fl_Input(L + 2 * WB, 2 * WB + 10 * BH, IW, BH, "Y expression"); view_input[5]->align(FL_ALIGN_RIGHT); view_input[5]->callback(view_options_ok_cb); - view_input[6] = new Fl_Input(L + 2 * WB, 2 * WB + 10 * BH, IW, BH, "Z expression"); + view_input[6] = new Fl_Input(L + 2 * WB, 2 * WB + 11 * BH, IW, BH, "Z expression"); view_input[6]->align(FL_ALIGN_RIGHT); view_input[6]->callback(view_options_ok_cb); @@ -3548,7 +3550,8 @@ void GUI::update_view_window(int num) opt_view_raise0(num, GMSH_GUI, 0); opt_view_raise1(num, GMSH_GUI, 0); opt_view_raise2(num, GMSH_GUI, 0); - for(int i = 43; i <= 45; i++) { + opt_view_normal_raise(num, GMSH_GUI, 0); + for(int i = 43; i <= 46; i++) { view_value[i]->step(val2/100.); view_value[i]->minimum(-val2); view_value[i]->maximum(val2); diff --git a/Graphics/Post.cpp b/Graphics/Post.cpp index 6813feb11b..da61841c85 100644 --- a/Graphics/Post.cpp +++ b/Graphics/Post.cpp @@ -1,4 +1,4 @@ -// $Id: Post.cpp,v 1.141 2007-11-08 14:44:13 geuzaine Exp $ +// $Id: Post.cpp,v 1.142 2007-12-07 20:49:05 geuzaine Exp $ // // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle // @@ -75,6 +75,31 @@ SVector3 getPointNormal(PView *p, double v) return n; } +SVector3 getLineNormal(PView *p, double x[2], double y[2], double z[2]) +{ + SBoundingBox3d bb = p->getData()->getBoundingBox(); + if(bb.min().z() == bb.max().z()) + return SVector3(0., 0., 1.); + else if(bb.min().y() == bb.max().y()) + return SVector3(0., 1., 0.); + else if(bb.min().x() == bb.max().x()) + return SVector3(1., 0., 0.); + else{ + // we don't have any info about the normal, just pick one + SVector3 t(x[1] - x[0], y[1] - y[0], z[1] - z[0]); + SVector3 ex(0., 0., 0.); + if(t[0] == 0.) + ex[0] = 1.; + else if(t[1] == 0.) + ex[1] = 1.; + else + ex[2] = 1.; + SVector3 n = crossprod(t, ex); + n.normalize(); + return n; + } +} + void getLineNormal(PView *p, double x[2], double y[2], double z[2], double *v, SVector3 n[2], bool computeNormal) { @@ -102,20 +127,8 @@ void getLineNormal(PView *p, double x[2], double y[2], double z[2], n[0] = n[1] = SVector3(0., 1., 0.); else if(bb.min().x() == bb.max().x()) n[0] = n[1] = SVector3(1., 0., 0.); - else{ - // we don't have any info about the normal, just pick one - SVector3 t(x[1] - x[0], y[1] - y[0], z[1] - z[0]); - SVector3 ex(0., 0., 0.); - if(t[0] == 0.) - ex[0] = 1.; - else if(t[1] == 0.) - ex[1] = 1.; - else - ex[2] = 1.; - n[0] = crossprod(t, ex); - n[0].normalize(); - n[1] = n[0]; - } + else + n[0] = n[1] = getLineNormal(p, x, y, z); } } @@ -190,8 +203,8 @@ void applyGeneralRaise(PView *p, int numNodes, int numComp, } } -void changeCoordinates(PView *p, int iele, int numNodes, int numComp, - double xyz[NMAX][3], double val[NMAX][9]) +void changeCoordinates(PView *p, int iele, int numNodes, int numEdges, + int numComp, double xyz[NMAX][3], double val[NMAX][9]) { PViewOptions *opt = p->getOptions(); @@ -236,6 +249,27 @@ void changeCoordinates(PView *p, int iele, int numNodes, int numComp, } } + if(opt->NormalRaise && numEdges >= 1 && numEdges <= 4){ + SVector3 n; + if(numEdges == 1){ + // assumes lines in z=0 plane, and raises in that plane + double x[2] = {xyz[0][0], xyz[1][0]}; + double y[2] = {xyz[0][1], xyz[1][1]}; + double z[2] = {xyz[0][2], xyz[1][2]}; + SVector3 p(0, 0, 1.); + SVector3 t(x[1] - x[0], y[1] - y[0], z[1] - z[0]); + n = crossprod(t, p); + n.normalize(); + } + else + n = normal3(xyz); + for(int i = 0; i < numNodes; i++){ + double v = ComputeScalarRep(numComp, val[i]); + for(int j = 0; j < 3; j++) + xyz[i][j] += n[j] * opt->NormalRaise * v; + } + } + if(numComp == 3 && opt->VectorType == PViewOptions::Displacement){ for(int i = 0; i < numNodes; i++){ for(int j = 0; j < 3; j++) @@ -894,7 +928,7 @@ void addElementsInArrays(PView *p, bool preprocessNormalsOnly) for(int k = 0; k < numComp; k++) data->getValue(i, j, k, opt->TimeStep, val[j][k]); } - changeCoordinates(p, i, numNodes, numComp, xyz, val); + changeCoordinates(p, i, numNodes, numEdges, numComp, xyz, val); for(int j = 0; j < numNodes; j++) opt->TmpBBox += SPoint3(xyz[j][0], xyz[j][1], xyz[j][2]); @@ -1131,7 +1165,7 @@ void drawGlyphs(PView *p) for(int k = 0; k < numComp; k++) data->getValue(i, j, k, opt->TimeStep, val[j][k]); } - changeCoordinates(p, i, numNodes, numComp, xyz, val); + changeCoordinates(p, i, numNodes, numEdges, numComp, xyz, val); if(opt->IntervalsType == PViewOptions::Numeric) drawNumberGlyphs(p, numNodes, numComp, xyz, val); if(dim == 2 && opt->Normals) diff --git a/Post/PViewOptions.h b/Post/PViewOptions.h index 1ff7ae59c6..e7b9d948c4 100644 --- a/Post/PViewOptions.h +++ b/Post/PViewOptions.h @@ -70,7 +70,8 @@ class PViewOptions { double AxesPosition[6]; double CustomMin, CustomMax, TmpMin, TmpMax, ExternalMin, ExternalMax; SBoundingBox3d TmpBBox; - double Offset[3], Raise[3], Transform[3][3], DisplacementFactor, Explode; + double Offset[3], Raise[3], Transform[3][3], DisplacementFactor, NormalRaise; + double Explode; double ArrowSize, ArrowRelHeadRadius, ArrowRelStemRadius, ArrowRelStemLength; double Normals, Tangents; int Visible, IntervalsType, NbIso, ArrowSizeProportional; -- GitLab