From b1761f5741721f4e6abe8e33d34475737a1ea564 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Tue, 22 Apr 2008 16:14:34 +0000
Subject: [PATCH] better getMeshvertices for jf

---
 Geo/GModel.cpp        | 80 ++++++++++++++-----------------------------
 Geo/GModel.h          | 10 +++---
 Geo/GModelIO_Mesh.cpp | 44 ++++++------------------
 3 files changed, 41 insertions(+), 93 deletions(-)

diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp
index bca22c9a7e..702f04f79a 100644
--- a/Geo/GModel.cpp
+++ b/Geo/GModel.cpp
@@ -1,4 +1,4 @@
-// $Id: GModel.cpp,v 1.85 2008-04-22 12:41:18 remacle Exp $
+// $Id: GModel.cpp,v 1.86 2008-04-22 16:14:34 geuzaine Exp $
 //
 // Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
 //
@@ -465,6 +465,31 @@ MVertex *GModel::getMeshVertexByTag(int n)
     return _vertexMapCache[n];
 }
 
+void GModel::getMeshVertices(int number, int dim, std::vector<MVertex*> &v)
+{
+  v.clear();
+  std::map<int, std::vector<GEntity*> > groups[4];
+  getPhysicalGroups(groups);
+  std::map<int, std::vector<GEntity*> >::const_iterator it = groups[dim].find(number);
+  if(it == groups[dim].end()) return;
+  const std::vector<GEntity *> &entities = it->second;
+  std::set<MVertex*> sv;
+  for(unsigned int i = 0; i < entities.size(); i++){
+    if(dim == 0){
+      GVertex *g = (GVertex*)entities[i];
+      sv.insert(g->mesh_vertices[0]);
+    }
+    else{
+      for(int j = 0; j < entities[i]->getNumMeshElements(); j++){
+	MElement *e = entities[i]->getMeshElement(j);
+	for(int k = 0; k < e->getNumVertices(); k++)
+	  sv.insert(e->getVertex(k));
+      }
+    }
+  }
+  v.insert(v.begin(), sv.begin(), sv.end());
+}
+
 template <class T>
 static void removeInvisible(std::vector<T*> &elements, bool all)
 {
@@ -790,56 +815,3 @@ void GModel::_associateEntityWithMeshVertices()
   }
 }
 
-void get_mesh_vertices (GVertex *g, std::set<MVertex*> &sv)
-{
-  sv.insert(g->mesh_vertices[0]);
-}
-void get_mesh_vertices (GEdge *g, std::set<MVertex*> &sv)
-{
-  sv.insert(g->mesh_vertices.begin(),g->mesh_vertices.end());
-  sv.insert(g->getBeginVertex()->mesh_vertices[0]);
-  sv.insert(g->getEndVertex()->mesh_vertices[0]);
-}
-void get_mesh_vertices (GFace *g, std::set<MVertex*> &sv)
-{
-  sv.insert(g->mesh_vertices.begin(),g->mesh_vertices.end());
-  std::list<GEdge*> l = g->edges();
-  for (std::list<GEdge*>::iterator it = l.begin();it !=l.end();++it)
-    get_mesh_vertices (*it, sv);
-}
-void get_mesh_vertices (GRegion *g, std::set<MVertex*> &sv)
-{
-  sv.insert(g->mesh_vertices.begin(),g->mesh_vertices.end());
-  std::list<GFace*> l = g->faces();
-  for (std::list<GFace*>::iterator it = l.begin();it !=l.end();++it)
-    get_mesh_vertices (*it, sv);
-}
-
-void GModel::getMeshVertices (int number, int dim, std::vector<MVertex*> &v)
-{
-  v.clear();
-  std::map<int, std::vector<GEntity*> > groups[4];
-  getPhysicalGroups(groups);
-  std::map<int, std::vector<GEntity*> >::const_iterator it = groups[dim].find(number);
-  if(it == groups[dim].end())return;
-  const std::vector<GEntity *> &entities = it->second;
-
-  std::set<MVertex*> sv;
-  for (int i=0;i<entities.size();i++){
-    switch(dim){
-    case 0 :  get_mesh_vertices ((GVertex*)entities[i], sv);break;
-    case 1 :  get_mesh_vertices ((GEdge*)entities[i], sv);break;
-    case 2 :  get_mesh_vertices ((GFace*)entities[i], sv);break;
-    case 3 :  get_mesh_vertices ((GRegion*)entities[i], sv);break;
-    default: throw;
-    }
-  }  
-  v.insert(v.begin(),sv.begin(),sv.end());
-
-}
-
-
-
-
-
-
diff --git a/Geo/GModel.h b/Geo/GModel.h
index 735d5312f5..de4f1efd15 100644
--- a/Geo/GModel.h
+++ b/Geo/GModel.h
@@ -166,13 +166,9 @@ class GModel
   // Associate a name with a physical number (returns new id if number==0)
   int setPhysicalName(std::string name, int number=0);
 
-  // create a new physical name and return the automatic associated number
+  // Get the name (if any) of a given physical group
   std::string getPhysicalName(int number);
 
-  // get all the mesh vertices associated to a given physical group
-  void getMeshVertices (int number, int dim, std::vector<MVertex*> &);
-  //  void getMeshVertices (std::string &name, std::vector<MVertex*> &);
-
   // The bounding box
   SBoundingBox3d bounds();
 
@@ -188,6 +184,10 @@ class GModel
   // Access a mesh vertex by tag, using the vertex cache
   MVertex *getMeshVertexByTag(int n);
 
+  // get all the mesh vertices associated with the physical group
+  // "number" of dimension "dim"
+  void getMeshVertices(int number, int dim, std::vector<MVertex*> &);
+
   // index all the (used) mesh vertices in a continuous sequence
   int indexMeshVertices(bool all);
 
diff --git a/Geo/GModelIO_Mesh.cpp b/Geo/GModelIO_Mesh.cpp
index 0f14ee671e..46c770ec24 100644
--- a/Geo/GModelIO_Mesh.cpp
+++ b/Geo/GModelIO_Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: GModelIO_Mesh.cpp,v 1.50 2008-04-02 17:21:33 geuzaine Exp $
+// $Id: GModelIO_Mesh.cpp,v 1.51 2008-04-22 16:14:34 geuzaine Exp $
 //
 // Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
 //
@@ -1349,41 +1349,17 @@ int GModel::writeUNV(const std::string &name, bool saveAll, bool saveGroupsOfNod
       for(std::map<int, std::vector<GEntity*> >::iterator it = groups[dim].begin();
           it != groups[dim].end(); it++){
         std::set<MVertex*> nodes;
-        for(unsigned int i = 0; i < it->second.size(); i++){
-          if(dim == 1){
-            GEdge *ge = (GEdge*)it->second[i];
-            for(unsigned int j = 0; j < ge->lines.size(); j++)
-              for(int k = 0; k < ge->lines[j]->getNumVertices(); k++)
-                nodes.insert(ge->lines[j]->getVertex(k));
-          }
-          else if(dim == 2){
-            GFace *gf = (GFace*)it->second[i];
-            for(unsigned int j = 0; j < gf->triangles.size(); j++)
-              for(int k = 0; k < gf->triangles[j]->getNumVertices(); k++)
-                nodes.insert(gf->triangles[j]->getVertex(k));
-            for(unsigned int j = 0; j < gf->quadrangles.size(); j++)
-              for(int k = 0; k < gf->quadrangles[j]->getNumVertices(); k++)
-                nodes.insert(gf->quadrangles[j]->getVertex(k));
-          }
-          else if(dim == 3){
-            GRegion *gr = (GRegion*)it->second[i];
-            for(unsigned int j = 0; j < gr->tetrahedra.size(); j++)
-              for(int k = 0; k < gr->tetrahedra[j]->getNumVertices(); k++)
-                nodes.insert(gr->tetrahedra[j]->getVertex(k));
-            for(unsigned int j = 0; j < gr->hexahedra.size(); j++)
-              for(int k = 0; k < gr->hexahedra[j]->getNumVertices(); k++)
-                nodes.insert(gr->hexahedra[j]->getVertex(k));
-            for(unsigned int j = 0; j < gr->prisms.size(); j++)
-              for(int k = 0; k < gr->prisms[j]->getNumVertices(); k++)
-                nodes.insert(gr->prisms[j]->getVertex(k));
-            for(unsigned int j = 0; j < gr->pyramids.size(); j++)
-              for(int k = 0; k < gr->pyramids[j]->getNumVertices(); k++)
-                nodes.insert(gr->pyramids[j]->getVertex(k));
-          }
-        }
+	std::vector<GEntity *> &entities = it->second;
+        for(unsigned int i = 0; i < entities.size(); i++){
+	  for(int j = 0; j < entities[i]->getNumMeshElements(); j++){
+	    MElement *e = entities[i]->getMeshElement(j);
+	    for (int k = 0; k < e->getNumVertices(); k++)
+	      nodes.insert(e->getVertex(k));
+	  }
+	}
         fprintf(fp, "%10d%10d%10d%10d%10d%10d%10d%10d\n", 
                 gr, 0, 0, 0, 0, 0, 0, (int)nodes.size());
-        fprintf(fp, "PERMENENT GROUP%d\n", gr++);
+        fprintf(fp, "PERMANENT GROUP%d\n", gr++);
         int row = 0;
         for(std::set<MVertex*>::iterator it2 = nodes.begin(); it2 != nodes.end(); it2++){
           if(row == 2) {
-- 
GitLab