From 99b08ecc84e0067eb5da19aeaf84007784b051eb Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Thu, 30 Nov 2006 01:06:07 +0000
Subject: [PATCH] finished implementation of numeric+interactive visibility
 stuff for physicals

---
 Common/Visibility.cpp | 11 +++++++++-
 Fltk/Callbacks.cpp    | 50 ++++++++++++++++++++++++++++++++-----------
 Fltk/Callbacks.h      |  2 +-
 Fltk/GUI.cpp          | 12 +++++------
 4 files changed, 55 insertions(+), 20 deletions(-)

diff --git a/Common/Visibility.cpp b/Common/Visibility.cpp
index e6bad03495..5484211927 100644
--- a/Common/Visibility.cpp
+++ b/Common/Visibility.cpp
@@ -1,4 +1,4 @@
-// $Id: Visibility.cpp,v 1.24 2006-11-29 20:40:46 geuzaine Exp $
+// $Id: Visibility.cpp,v 1.25 2006-11-30 01:06:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -258,10 +258,19 @@ void VisibilityManager::setVisibilityByNumber(int type, int num, char val, bool
       if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive);
     break;
   case 6: // physical point
+    for(GModel::viter it = GMODEL->firstVertex(); it != GMODEL->lastVertex(); it++)
+      for(unsigned int i = 0; i < (*it)->physicals.size(); i++)
+	if (all || (*it)->physicals[i] == num) (*it)->setVisibility(val, recursive);
     break;
   case 7: // physical line
+    for(GModel::eiter it = GMODEL->firstEdge(); it != GMODEL->lastEdge(); it++)
+      for(unsigned int i = 0; i < (*it)->physicals.size(); i++)
+	if (all || (*it)->physicals[i] == num) (*it)->setVisibility(val, recursive);
     break;
   case 8: // physical surface
+    for(GModel::fiter it = GMODEL->firstFace(); it != GMODEL->lastFace(); it++)
+      for(unsigned int i = 0; i < (*it)->physicals.size(); i++)
+	if (all || (*it)->physicals[i] == num) (*it)->setVisibility(val, recursive);
     break;
   case 9: // physical volume
     for(GModel::riter it = GMODEL->firstRegion(); it != GMODEL->lastRegion(); it++)
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 14903e10a7..f1719c11b8 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.488 2006-11-29 20:40:46 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.489 2006-11-30 01:06:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -2163,7 +2163,7 @@ void visibility_number_cb(CALLBACK_ARGS)
   Draw();
 }
 
-void visibility_hide_cb(CALLBACK_ARGS)
+void visibility_interactive_cb(CALLBACK_ARGS)
 {
   char *str = (char*)data;
   int what;
@@ -2201,27 +2201,53 @@ void visibility_hide_cb(CALLBACK_ARGS)
   std::vector<GRegion*> regions;
   std::vector<MElement*> elements;
 
-  int recursive = WID->vis_butt[0]->value();
-
   while(1) {
     CTX.mesh.changed = ENT_ALL;
     Draw();
     Msg(ONSCREEN, "Select %s\n[Press 'q' to abort]", str);
     char ib = SelectEntity(what, vertices, edges, faces, regions, elements);
     if(ib == 'l') {
+      // type = 0 for elementary, 1 for physical and 2 for partitions
+      int type = WID->vis_type->value();
+      if(type != 0 && type != 1) break;
+      int recursive = WID->vis_butt[0]->value();
       if(CTX.pick_elements){
 	for(unsigned int i = 0; i < elements.size(); i++)
 	  elements[i]->setVisibility(0);
       }
       else{
-	for(unsigned int i = 0; i < vertices.size(); i++)
-	  vertices[i]->setVisibility(0);
-	for(unsigned int i = 0; i < edges.size(); i++)
-	  edges[i]->setVisibility(0, recursive);
-	for(unsigned int i = 0; i < faces.size(); i++)
-	  faces[i]->setVisibility(0, recursive);
-	for(unsigned int i = 0; i < regions.size(); i++)
-	  regions[i]->setVisibility(0, recursive);
+	for(unsigned int i = 0; i < vertices.size(); i++){
+	  if(type == 0) // hide elementary entity
+	    vertices[i]->setVisibility(0, recursive);
+	  else // hide physical entity
+	    for(unsigned int j = 0; j < vertices[i]->physicals.size(); j++)
+	      VisibilityManager::instance()->setVisibilityByNumber
+		(6, vertices[i]->physicals[j], 0, recursive);
+	}
+	for(unsigned int i = 0; i < edges.size(); i++){
+	  if(type == 0)
+	    edges[i]->setVisibility(0, recursive);
+	  else
+	    for(unsigned int j = 0; j < edges[i]->physicals.size(); j++)
+	      VisibilityManager::instance()->setVisibilityByNumber
+		(7, edges[i]->physicals[j], 0, recursive);
+	}
+	for(unsigned int i = 0; i < faces.size(); i++){
+	  if(type == 0)
+	    faces[i]->setVisibility(0, recursive);
+	  else
+	    for(unsigned int j = 0; j < faces[i]->physicals.size(); j++)
+	      VisibilityManager::instance()->setVisibilityByNumber
+		(8, faces[i]->physicals[j], 0, recursive);
+	}
+	for(unsigned int i = 0; i < regions.size(); i++){
+	  if(type == 0)
+	    regions[i]->setVisibility(0, recursive);
+	  else
+	    for(unsigned int j = 0; j < regions[i]->physicals.size(); j++)
+	      VisibilityManager::instance()->setVisibilityByNumber
+		(9, regions[i]->physicals[j], 0, recursive);
+	}
       }
       int pos = WID->vis_browser->position();
       visibility_cb(NULL, NULL);
diff --git a/Fltk/Callbacks.h b/Fltk/Callbacks.h
index 0b9a012332..5abd6bbcc4 100644
--- a/Fltk/Callbacks.h
+++ b/Fltk/Callbacks.h
@@ -153,7 +153,7 @@ void message_save_cb(CALLBACK_ARGS);
 void visibility_cb(CALLBACK_ARGS);
 void visibility_sort_cb(CALLBACK_ARGS);
 void visibility_number_cb(CALLBACK_ARGS);
-void visibility_hide_cb(CALLBACK_ARGS);
+void visibility_interactive_cb(CALLBACK_ARGS);
 void visibility_ok_cb(CALLBACK_ARGS);
 void visibility_save_cb(CALLBACK_ARGS);
 void visibility_delete_cb(CALLBACK_ARGS);
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index e7768cca03..34da9e609d 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.571 2006-11-29 20:40:46 geuzaine Exp $
+// $Id: GUI.cpp,v 1.572 2006-11-30 01:06:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -4015,15 +4015,15 @@ void GUI::create_visibility_window()
     b2->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT);
 
     Fl_Button *butt1 = new Fl_Button(2*WB, 3 * WB + 3 * BH, IW, BH, "Elements");
-    butt1->callback(visibility_hide_cb, (void *)"elements");
+    butt1->callback(visibility_interactive_cb, (void *)"elements");
     Fl_Button *butt2 = new Fl_Button(2*WB, 3 * WB + 4 * BH, IW, BH, "Points");
-    butt2->callback(visibility_hide_cb, (void *)"points");
+    butt2->callback(visibility_interactive_cb, (void *)"points");
     Fl_Button *butt3 = new Fl_Button(2*WB, 3 * WB + 5 * BH, IW, BH, "Lines");
-    butt3->callback(visibility_hide_cb, (void *)"lines");
+    butt3->callback(visibility_interactive_cb, (void *)"lines");
     Fl_Button *butt4 = new Fl_Button(2*WB, 3 * WB + 6 * BH, IW, BH, "Surfaces");
-    butt4->callback(visibility_hide_cb, (void *)"surfaces");
+    butt4->callback(visibility_interactive_cb, (void *)"surfaces");
     Fl_Button *butt5 = new Fl_Button(2*WB, 3 * WB + 7 * BH, IW, BH, "Volumes");
-    butt5->callback(visibility_hide_cb, (void *)"volumes");
+    butt5->callback(visibility_interactive_cb, (void *)"volumes");
     
     vis_group[2]->end();
   }
-- 
GitLab