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