From bbfbc4e1d516eb0734bb810e09ebee70b7cacaf8 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Tue, 5 Nov 2002 19:52:06 +0000
Subject: [PATCH] Add basic support for merging views

---
 Common/CommandLine.cpp    |  4 +--
 Common/Views.cpp          | 55 ++++++++++++++++++++++++++++++++++++---
 Common/Views.h            |  5 ++--
 Fltk/Callbacks.cpp        | 16 +++++++++---
 Fltk/Callbacks.h          |  2 ++
 Fltk/GUI.cpp              |  6 ++++-
 Parser/OpenFile.cpp       |  4 +--
 Plugin/LevelsetPlugin.cpp |  4 +--
 8 files changed, 81 insertions(+), 15 deletions(-)

diff --git a/Common/CommandLine.cpp b/Common/CommandLine.cpp
index b50ef26b50..7037d756bf 100644
--- a/Common/CommandLine.cpp
+++ b/Common/CommandLine.cpp
@@ -1,4 +1,4 @@
-// $Id: CommandLine.cpp,v 1.3 2002-10-25 01:16:02 geuzaine Exp $
+// $Id: CommandLine.cpp,v 1.4 2002-11-05 19:52:06 geuzaine Exp $
 //
 // Copyright (C) 1997 - 2002 C. Geuzaine, J.-F. Remacle
 //
@@ -210,7 +210,7 @@ void Get_Options (int argc, char *argv[], int *nbfiles) {
 	if(argv[i] && argv[i+1]){
 	  ParseFile(argv[i],0);
 	  if(List_Nbr(CTX.post.list))
-	    Write_View(1,(Post_View*)List_Pointer(CTX.post.list, 0),argv[i+1]);
+	    WriteView(1,(Post_View*)List_Pointer(CTX.post.list, 0),argv[i+1]);
 	  else
 	    fprintf(stderr, ERROR_STR "No view to convert\n");
 	}
diff --git a/Common/Views.cpp b/Common/Views.cpp
index 854124e45e..3548adbaf4 100644
--- a/Common/Views.cpp
+++ b/Common/Views.cpp
@@ -1,4 +1,4 @@
-// $Id: Views.cpp,v 1.79 2002-10-12 19:41:13 geuzaine Exp $
+// $Id: Views.cpp,v 1.80 2002-11-05 19:52:06 geuzaine Exp $
 //
 // Copyright (C) 1997 - 2002 C. Geuzaine, J.-F. Remacle
 //
@@ -588,7 +588,7 @@ Post_View *Create2DGraph(char *xname, char *yname,
 
 // INput/output
 
-void Read_View(FILE *file, char *filename){
+void ReadView(FILE *file, char *filename){
   char   str[256], name[256];
   int    i, nb, format, size, testone, swap, t2l, t3l;
   double version;
@@ -794,7 +794,7 @@ void Read_View(FILE *file, char *filename){
 // FIXME: add a format similar to the msh format (node list + simplex list)
 // FIXME: add a structured format
 
-void Write_View(int Flag_BIN, Post_View *v, char *filename){
+void WriteView(int Flag_BIN, Post_View *v, char *filename){
   FILE *file;
   char name[256];
   int i, f, One=1;
@@ -1195,3 +1195,52 @@ void Post_View :: transform (double mat[3][3]){
   }
 }
 
+// merge lists
+
+static void merge(List_T *a , List_T *b){
+  if(!a || !b) return;
+  for(int i=0;i<List_Nbr(a);i++){
+    List_Add(b,List_Pointer(a,i));
+  }
+}
+
+void MergeViews(int all){
+  Post_View *vm = BeginView(1);
+  for(int i=0; i<List_Nbr(CTX.post.list)-1; i++){
+    Post_View *v = (Post_View*)List_Pointer(CTX.post.list, i);
+    if(all || v->Visible){
+      Msg(DEBUG, "Merging view %d", i);
+      merge(v->SP,vm->SP); vm->NbSP += v->NbSP;
+      merge(v->VP,vm->VP); vm->NbVP += v->NbVP; 
+      merge(v->TP,vm->TP); vm->NbTP += v->NbTP;
+      merge(v->SL,vm->SL); vm->NbSL += v->NbSL;
+      merge(v->VL,vm->VL); vm->NbVL += v->NbVL;
+      merge(v->TL,vm->TL); vm->NbTL += v->NbTL;
+      merge(v->ST,vm->ST); vm->NbST += v->NbST;
+      merge(v->VT,vm->VT); vm->NbVT += v->NbVT;
+      merge(v->TT,vm->TT); vm->NbTT += v->NbTT;
+      merge(v->SQ,vm->SQ); vm->NbSQ += v->NbSQ;
+      merge(v->VQ,vm->VQ); vm->NbVQ += v->NbVQ;
+      merge(v->TQ,vm->TQ); vm->NbTQ += v->NbTQ;
+      merge(v->SS,vm->SS); vm->NbSS += v->NbSS;
+      merge(v->VS,vm->VS); vm->NbVS += v->NbVS;
+      merge(v->TS,vm->TS); vm->NbTS += v->NbTS;
+      merge(v->SH,vm->SH); vm->NbSH += v->NbSH;
+      merge(v->VH,vm->VH); vm->NbVH += v->NbVH;
+      merge(v->TH,vm->TH); vm->NbTH += v->NbTH;
+      merge(v->SI,vm->SI); vm->NbSI += v->NbSI;
+      merge(v->VI,vm->VI); vm->NbVI += v->NbVI;
+      merge(v->TI,vm->TI); vm->NbTI += v->NbTI;
+      merge(v->SY,vm->SY); vm->NbSY += v->NbSY;
+      merge(v->VY,vm->VY); vm->NbVY += v->NbVY;
+      merge(v->TY,vm->TY); vm->NbTY += v->NbTY;
+      /* this more complicted: have to change the indices
+	 merge(v->T2D,vm->T2D);
+	 merge(v->T2C,vm->T2C); v->NbT2 += vm->NbT2;
+	 merge(v->T3D,vm->T3D);
+	 merge(v->T3C,vm->T3C); v->NbT2 += vm->NbT2;
+      */
+    }
+  }
+  EndView(vm, 1, "merged.pos", "merged");
+}
diff --git a/Common/Views.h b/Common/Views.h
index 0752e618e6..a5207e2196 100644
--- a/Common/Views.h
+++ b/Common/Views.h
@@ -138,9 +138,10 @@ void DuplicateView(Post_View *v1, int withoptions);
 void DuplicateView(int num, int withoptions);
 void FreeView(Post_View *v);
 bool FreeView(int num);
-void Read_View(FILE *file, char *filename);
-void Write_View(int Flag_BIN, Post_View *v, char *filename);
+void ReadView(FILE *file, char *filename);
+void WriteView(int Flag_BIN, Post_View *v, char *filename);
 void CopyViewOptions(Post_View *src, Post_View *dest);
+void MergeViews(int all);
 
 int BGMWithView (Post_View *ErrView);
 int CreateBGM(Post_View *ErrView, int OptiMethod, double Degree,
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 77d0c19534..4bf0445ea8 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.147 2002-11-05 02:03:46 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.148 2002-11-05 19:52:06 geuzaine Exp $
 //
 // Copyright (C) 1997 - 2002 C. Geuzaine, J.-F. Remacle
 //
@@ -2136,7 +2136,7 @@ void view_save_ascii_cb(CALLBACK_ARGS){
 	  goto test;
     }
   save:
-    Write_View(0, (Post_View*)List_Pointer(CTX.post.list,(long int)data), name); 
+    WriteView(0, (Post_View*)List_Pointer(CTX.post.list,(long int)data), name); 
   }
 }
 
@@ -2153,7 +2153,7 @@ void view_save_binary_cb(CALLBACK_ARGS){
 	  goto test;
     }
   save:
-    Write_View(1, (Post_View*)List_Pointer(CTX.post.list,(long int)data), name); 
+    WriteView(1, (Post_View*)List_Pointer(CTX.post.list,(long int)data), name); 
   }
 }
 
@@ -2166,6 +2166,16 @@ void view_duplicate_with_options_cb(CALLBACK_ARGS){
   Draw();
 }
 
+void view_merge_all_cb(CALLBACK_ARGS) {
+  MergeViews(1);
+  Draw();
+}
+
+void view_merge_visible_cb(CALLBACK_ARGS) {
+  MergeViews(0);
+  Draw();
+}
+
 void view_applybgmesh_cb(CALLBACK_ARGS){
   Post_View *v = (Post_View*)List_Pointer(CTX.post.list,(long int)data);
   if(!v->ScalarOnly || v->TextOnly){
diff --git a/Fltk/Callbacks.h b/Fltk/Callbacks.h
index 6060d6612b..ee2415ee1f 100644
--- a/Fltk/Callbacks.h
+++ b/Fltk/Callbacks.h
@@ -251,6 +251,8 @@ void view_save_ascii_cb(CALLBACK_ARGS) ;
 void view_save_binary_cb(CALLBACK_ARGS) ;
 void view_duplicate_cb(CALLBACK_ARGS) ;
 void view_duplicate_with_options_cb(CALLBACK_ARGS) ;
+void view_merge_all_cb(CALLBACK_ARGS) ;
+void view_merge_visible_cb(CALLBACK_ARGS) ;
 void view_applybgmesh_cb(CALLBACK_ARGS) ;
 void view_options_cb(CALLBACK_ARGS) ;
 void view_plugin_cb(CALLBACK_ARGS) ;
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index ff7aaffbc3..d1e93628eb 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.208 2002-11-03 21:55:24 geuzaine Exp $
+// $Id: GUI.cpp,v 1.209 2002-11-05 19:52:06 geuzaine Exp $
 //
 // Copyright (C) 1997 - 2002 C. Geuzaine, J.-F. Remacle
 //
@@ -801,6 +801,10 @@ void GUI::create_menu_window(int argc, char **argv){
 	       (Fl_Callback *)view_duplicate_cb, (void*)i, 0) ;
       pop->add("Duplicate/View with options", 0,
 	       (Fl_Callback *)view_duplicate_with_options_cb, (void*)i, 0) ;
+      pop->add("Merge/All views", 0,
+	       (Fl_Callback *)view_merge_all_cb, (void*)i, 0) ;
+      pop->add("Merge/All visible views", 0,
+	       (Fl_Callback *)view_merge_visible_cb, (void*)i, 0) ;
       pop->add("Save as/ASCII view...", 0,
 	       (Fl_Callback *)view_save_ascii_cb, (void*)i, 0) ;
       pop->add("Save as/Binary view...", 0,
diff --git a/Parser/OpenFile.cpp b/Parser/OpenFile.cpp
index 36f7c27eaf..9e6da68d6f 100644
--- a/Parser/OpenFile.cpp
+++ b/Parser/OpenFile.cpp
@@ -1,4 +1,4 @@
-// $Id: OpenFile.cpp,v 1.32 2002-10-11 01:38:13 geuzaine Exp $
+// $Id: OpenFile.cpp,v 1.33 2002-11-05 19:52:06 geuzaine Exp $
 //
 // Copyright (C) 1997 - 2002 C. Geuzaine, J.-F. Remacle
 //
@@ -77,7 +77,7 @@ int ParseFile(char *f, int silent){
   }
   else if(!strncmp(String, "$PostFormat", 11) ||
           !strncmp(String, "$View", 5)){
-    Read_View(yyin, yyname);
+    ReadView(yyin, yyname);
     status = 0;
   }
   else{
diff --git a/Plugin/LevelsetPlugin.cpp b/Plugin/LevelsetPlugin.cpp
index 29937a5c63..c27fce0e9f 100644
--- a/Plugin/LevelsetPlugin.cpp
+++ b/Plugin/LevelsetPlugin.cpp
@@ -1,4 +1,4 @@
-// $Id: LevelsetPlugin.cpp,v 1.24 2002-05-20 18:28:30 geuzaine Exp $
+// $Id: LevelsetPlugin.cpp,v 1.25 2002-11-05 19:52:06 geuzaine Exp $
 //
 // Copyright (C) 1997 - 2002 C. Geuzaine, J.-F. Remacle
 //
@@ -38,7 +38,7 @@ void GMSH_LevelsetPlugin::Save ()
 {
   if(processed){
     Msg(INFO, "Writing file '%s'", OutputFileName);
-    Write_View(0, processed, OutputFileName);
+    WriteView(0, processed, OutputFileName);
     Msg(INFO, "Levelset ouput complete '%s'", OutputFileName);
     Msg(STATUS2, "Wrote '%s'", OutputFileName);
   }
-- 
GitLab