diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp index 1f4d58a47e50b342e8c837266e5a27a7224eded5..06cab53c6d6c85f36b5faf45f07df432090fcb4e 100644 --- a/Geo/GModel.cpp +++ b/Geo/GModel.cpp @@ -1,4 +1,4 @@ -// $Id: GModel.cpp,v 1.18 2006-11-01 22:19:26 geuzaine Exp $ +// $Id: GModel.cpp,v 1.19 2006-11-02 18:28:08 geuzaine Exp $ // // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle // @@ -81,68 +81,35 @@ GVertex * GModel::vertexByTag(int n) const return 0; } -template<class T> -static bool removeElement(MElement *e, std::vector<T*> &vec) +template <class T> +static void removeInvisibleElements(std::vector<T*> &elements) { - typename std::vector<T*>::iterator it = std::find(vec.begin(), vec.end(), e); - if(it == vec.end()) return false; - vec.erase(it); - delete e; - return true; -} - -bool GModel::remove(MElement *e) -{ - switch(e->getDim()){ - case 3: - for(riter it = firstRegion(); it != lastRegion(); ++it){ - if(removeElement(e, (*it)->tetrahedra)) return true; - if(removeElement(e, (*it)->hexahedra)) return true; - if(removeElement(e, (*it)->prisms)) return true; - if(removeElement(e, (*it)->pyramids)) return true; - } - break; - case 2: - for(fiter it = firstFace(); it != lastFace(); ++it){ - if(removeElement(e, (*it)->triangles)) return true; - if(removeElement(e, (*it)->quadrangles)) return true; - } - break; - case 1: - for(eiter it = firstEdge(); it != lastEdge(); ++it){ - if(removeElement(e, (*it)->lines)) return true; - } - break; + std::vector<T*> tmp; + for(unsigned int i = 0; i < elements.size(); i++){ + if(elements[i]->getVisibility()) + tmp.push_back(elements[i]); + else + delete elements[i]; } - return false; + elements.clear(); + elements = tmp; } void GModel::removeInvisible() { - // FIXME: should make this faster - std::vector<MElement*> ele; for(riter it = firstRegion(); it != lastRegion(); ++it){ - for(unsigned int i = 0; i < (*it)->tetrahedra.size(); i++) - if(!(*it)->tetrahedra[i]->getVisibility()) ele.push_back((*it)->tetrahedra[i]); - for(unsigned int i = 0; i < (*it)->hexahedra.size(); i++) - if(!(*it)->hexahedra[i]->getVisibility()) ele.push_back((*it)->hexahedra[i]); - for(unsigned int i = 0; i < (*it)->prisms.size(); i++) - if(!(*it)->prisms[i]->getVisibility()) ele.push_back((*it)->prisms[i]); - for(unsigned int i = 0; i < (*it)->pyramids.size(); i++) - if(!(*it)->pyramids[i]->getVisibility()) ele.push_back((*it)->pyramids[i]); + removeInvisibleElements((*it)->tetrahedra); + removeInvisibleElements((*it)->hexahedra); + removeInvisibleElements((*it)->prisms); + removeInvisibleElements((*it)->pyramids); } for(fiter it = firstFace(); it != lastFace(); ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); i++) - if(!(*it)->triangles[i]->getVisibility()) ele.push_back((*it)->triangles[i]); - for(unsigned int i = 0; i < (*it)->quadrangles.size(); i++) - if(!(*it)->quadrangles[i]->getVisibility()) ele.push_back((*it)->quadrangles[i]); + removeInvisibleElements((*it)->triangles); + removeInvisibleElements((*it)->quadrangles); } for(eiter it = firstEdge(); it != lastEdge(); ++it){ - for(unsigned int i = 0; i < (*it)->lines.size(); i++) - if(!(*it)->lines[i]->getVisibility()) ele.push_back((*it)->lines[i]); + removeInvisibleElements((*it)->lines); } - for(unsigned int i = 0; i < ele.size(); i++) - remove(ele[i]); std::vector<GRegion*> r; for(riter it = firstRegion(); it != lastRegion(); ++it) diff --git a/Geo/GModel.h b/Geo/GModel.h index a4e1acc01349a88399a0aca70504504b37313189..ffcf7ee62b6dd0ee945b071cb8e1d7a9568a194b 100644 --- a/Geo/GModel.h +++ b/Geo/GModel.h @@ -90,9 +90,8 @@ class GModel void remove(GFace *f) { faces.erase(std::find(firstFace(), lastFace(), f)); } void remove(GEdge *e) { edges.erase(std::find(firstEdge(), lastEdge(), e)); } void remove(GVertex *v) { vertices.erase(std::find(firstVertex(), lastVertex(), v)); } - bool remove(MElement *e); - // Deletes all invisble stuff (entities and elements) + // Deletes all invisble entities and mesh elements void removeInvisible(); // Renumber all the mesh vertices in a continuous sequence