From 408e9282034d1d8ca31f6d3c4404c27254bbd148 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Mon, 25 Oct 2004 19:19:30 +0000
Subject: [PATCH] new option to draw the arrows with a fixed size

---
 Common/DefaultOptions.h  |  2 ++
 Common/Options.cpp       | 15 ++++++++++++++-
 Common/Options.h         |  1 +
 Common/Views.cpp         |  3 ++-
 Common/Views.h           |  2 +-
 Fltk/Callbacks.cpp       |  7 ++++++-
 Fltk/GUI.cpp             |  8 +++++++-
 Graphics/PostElement.cpp |  8 +++++---
 8 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index 7ca7271c42..05951d252b 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -974,6 +974,8 @@ StringXNumber ViewOptions_Number[] = {
     "Arrow location (1=cog, 2=node)" },
   { F|O, "ArrowSize" , opt_view_arrow_size , 60. ,
     "Display size of arrows (in pixels)" },
+  { F|O, "ArrowSizeProportional" , opt_view_arrow_size_proportional , 1. ,
+    "Scale the arrows according to the norm of the vector" },
   { F|O, "ArrowStemLength" , opt_view_arrow_stem_length , 0.56 ,
     "Relative length of arrow stem" },
   { F|O, "ArrowStemRadius" , opt_view_arrow_stem_radius , 0.02 ,
diff --git a/Common/Options.cpp b/Common/Options.cpp
index bfff11196e..f6c3d3ee31 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1,4 +1,4 @@
-// $Id: Options.cpp,v 1.193 2004-10-25 00:45:47 geuzaine Exp $
+// $Id: Options.cpp,v 1.194 2004-10-25 19:19:29 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -4494,6 +4494,19 @@ double opt_view_arrow_size(OPT_ARGS_NUM)
   return v->ArrowSize;
 }
 
+double opt_view_arrow_size_proportional(OPT_ARGS_NUM)
+{
+  GET_VIEW(0.);
+  if(action & GMSH_SET) {
+    v->ArrowSizeProportional = (int)val;
+  }
+#if defined(HAVE_FLTK)
+  if(_gui_action_valid(action, num))
+    WID->view_butt[0]->value(v->ArrowSizeProportional);
+#endif
+  return v->ArrowSizeProportional;
+}
+
 double opt_view_arrow_head_radius(OPT_ARGS_NUM)
 {
   GET_VIEW(0.);
diff --git a/Common/Options.h b/Common/Options.h
index f9feaf6a88..a3171417f5 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -463,6 +463,7 @@ double opt_view_raise0(OPT_ARGS_NUM);
 double opt_view_raise1(OPT_ARGS_NUM);
 double opt_view_raise2(OPT_ARGS_NUM);
 double opt_view_arrow_size(OPT_ARGS_NUM);
+double opt_view_arrow_size_proportional(OPT_ARGS_NUM);
 double opt_view_arrow_head_radius(OPT_ARGS_NUM);
 double opt_view_arrow_stem_length(OPT_ARGS_NUM);
 double opt_view_arrow_stem_radius(OPT_ARGS_NUM);
diff --git a/Common/Views.cpp b/Common/Views.cpp
index 20e1371314..5cc2a666fc 100644
--- a/Common/Views.cpp
+++ b/Common/Views.cpp
@@ -1,4 +1,4 @@
-// $Id: Views.cpp,v 1.141 2004-10-21 17:02:25 geuzaine Exp $
+// $Id: Views.cpp,v 1.142 2004-10-25 19:19:29 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -620,6 +620,7 @@ void CopyViewOptions(Post_View * src, Post_View * dest)
   dest->Raise[1] = src->Raise[1];
   dest->Raise[2] = src->Raise[2];
   dest->ArrowSize = src->ArrowSize;
+  dest->ArrowSizeProportional = src->ArrowSizeProportional;
   dest->ArrowRelHeadRadius = src->ArrowRelHeadRadius;
   dest->ArrowRelStemLength = src->ArrowRelStemLength;
   dest->ArrowRelStemRadius = src->ArrowRelStemRadius;
diff --git a/Common/Views.h b/Common/Views.h
index 34b4862290..da1021ae19 100644
--- a/Common/Views.h
+++ b/Common/Views.h
@@ -150,7 +150,7 @@ class Post_View{
   double CustomMin, CustomMax;
   double Offset[3], Raise[3], DisplacementFactor, Explode;
   double ArrowSize, ArrowRelHeadRadius, ArrowRelStemRadius, ArrowRelStemLength;
-  int Visible, IntervalsType, NbIso, NbAbscissa;
+  int Visible, IntervalsType, NbIso, NbAbscissa, ArrowSizeProportional;
   int Light, LightTwoSide, SmoothNormals;
   double AngleSmoothNormals, AlphaChannel;
   int SaturateValues;
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 2305a2fcd7..8f758b8ece 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.288 2004-10-25 00:45:47 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.289 2004-10-25 19:19:30 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -3468,6 +3468,7 @@ void view_options_ok_cb(CALLBACK_ARGS)
   double raise2 = opt_view_raise2(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);
   double displacement_factor = opt_view_displacement_factor(current, GMSH_GET, 0);
   double raised_view = opt_view_raised_view(current, GMSH_GET, 0);
   double point_size = opt_view_point_size(current, GMSH_GET, 0);
@@ -3610,6 +3611,10 @@ void view_options_ok_cb(CALLBACK_ARGS)
 
       // view_butts
 
+      val = WID->view_butt[0]->value();
+      if(force || (val != arrow_size_proportional))
+        opt_view_arrow_size_proportional(i, GMSH_SET, val);
+
       val = WID->view_butt[1]->value() ? DRAW_POST_3D :
 	WID->view_butt[2]->value() ? DRAW_POST_2D_SPACE : DRAW_POST_2D_TIME;
       if(force || (val != type))
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index 65e3a029af..41d47c5271 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.367 2004-10-21 17:02:25 geuzaine Exp $
+// $Id: GUI.cpp,v 1.368 2004-10-25 19:19:30 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -2627,6 +2627,11 @@ void GUI::create_option_window()
         view_value[60]->step(1);
         view_value[60]->align(FL_ALIGN_RIGHT);
 
+	view_butt[0] = new Fl_Check_Button(L + 2 * IW - 2 * WB, 2 * WB + 7 * BH, (int)(1.5*BB), BH, "Proportional");
+	view_butt[0]->type(FL_TOGGLE_BUTTON);
+	view_butt[0]->down_box(TOGGLE_BOX);
+	view_butt[0]->selection_color(TOGGLE_COLOR);
+
         view_value[63] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 8 * BH, IW, BH, "Displacement factor");
         view_value[63]->minimum(0.);
         view_value[63]->maximum(1.);
@@ -2844,6 +2849,7 @@ void GUI::update_view_window(int num)
   opt_view_line_type(num, GMSH_GUI, 0);
   opt_view_vector_type(num, GMSH_GUI, 0);
   opt_view_arrow_size(num, GMSH_GUI, 0);
+  opt_view_arrow_size_proportional(num, GMSH_GUI, 0);
 
   opt_view_displacement_factor(num, GMSH_GUI, 0);
   double val3 = 2. * CTX.lc / maxval;
diff --git a/Graphics/PostElement.cpp b/Graphics/PostElement.cpp
index ac3c920e8e..98879ec125 100644
--- a/Graphics/PostElement.cpp
+++ b/Graphics/PostElement.cpp
@@ -1,4 +1,4 @@
-// $Id: PostElement.cpp,v 1.47 2004-10-21 23:42:50 geuzaine Exp $
+// $Id: PostElement.cpp,v 1.48 2004-10-25 19:19:30 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -1162,7 +1162,8 @@ void Draw_VectorElement(int type, Post_View * View, int preproNormals,
         Draw_String(Num);
       }
       else {
-        fact = CTX.pixel_equiv_x / CTX.s[0] * View->ArrowSize / ValMax;
+        fact = CTX.pixel_equiv_x / CTX.s[0] * View->ArrowSize / 
+	  (View->ArrowSizeProportional ? ValMax : dd);
         if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin > 0) {
           dx /= dd;
           dy /= dd;
@@ -1187,7 +1188,8 @@ void Draw_VectorElement(int type, Post_View * View, int preproNormals,
 	else
 	  PaletteDiscrete(View, View->NbIso,
 			  View->GIFV(ValMin, ValMax, View->NbIso, norm[k]));
-        fact = CTX.pixel_equiv_x / CTX.s[0] * View->ArrowSize / ValMax;
+        fact = CTX.pixel_equiv_x / CTX.s[0] * View->ArrowSize /
+	  (View->ArrowSizeProportional ? ValMax : norm[k]);
         if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin > 0) {
           Val[k][0] /= norm[k];
           Val[k][1] /= norm[k];
-- 
GitLab