diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp index 5f7eecdb5e4df51022af7e480fcdddb4509086e5..749e3b38462121b1f9bd0ad4d69fa39518fdd49e 100644 --- a/Fltk/Callbacks.cpp +++ b/Fltk/Callbacks.cpp @@ -1,4 +1,4 @@ -// $Id: Callbacks.cpp,v 1.471 2006-11-04 15:21:32 geuzaine Exp $ +// $Id: Callbacks.cpp,v 1.472 2006-11-05 18:02:59 geuzaine Exp $ // // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle // @@ -3516,46 +3516,70 @@ void mesh_delete_cb(CALLBACK_ARGS) void mesh_delete_parts_cb(CALLBACK_ARGS) { char *str = (char*)data; + int what; - if(!strcmp(str, "elements")) + if(!strcmp(str, "elements")){ CTX.pick_elements = 1; - else + what = ENT_ALL; + } + else if(!strcmp(str, "lines")){ CTX.pick_elements = 0; - CTX.mesh.changed = ENT_ALL; + what = ENT_LINE; + } + else if(!strcmp(str, "surfaces")){ + CTX.pick_elements = 0; + what = ENT_SURFACE; + } + else if(!strcmp(str, "volumes")){ + CTX.pick_elements = 0; + what = ENT_VOLUME; + } + else + return; std::vector<GVertex*> vertices; std::vector<GEdge*> edges; - std::vector<GFace*> faces, fac; + std::vector<GFace*> faces; std::vector<GRegion*> regions; - std::vector<MElement*> elements, ele; + std::vector<MElement*> elements; + + std::vector<MElement*> ele; + std::vector<GEntity*> ent; while(1) { - if(CTX.pick_elements) CTX.mesh.changed = ENT_ALL; + CTX.mesh.changed = ENT_ALL; Draw(); - if(ele.size() || fac.size()) + if(ele.size() || ent.size()) Msg(ONSCREEN, "Select %s\n" "[Press 'e' to end selection, 'u' to undo last selection or 'q' to abort]", str); else Msg(ONSCREEN, "Select %s\n" "[Press 'e' to end selection or 'q' to abort]", str); - char ib = SelectEntity(CTX.pick_elements ? ENT_ALL : ENT_SURFACE, - vertices, edges, faces, regions, elements); + char ib = SelectEntity(what, vertices, edges, faces, regions, elements); if(ib == 'l') { if(CTX.pick_elements){ for(unsigned int i = 0; i < elements.size(); i++){ if(elements[i]->getVisibility() != 2){ - elements[i]->setVisibility(2); - ele.push_back(elements[i]); + elements[i]->setVisibility(2); ele.push_back(elements[i]); } } } else{ + for(unsigned int i = 0; i < edges.size(); i++){ + if(edges[i]->getSelection() != 1){ + edges[i]->setSelection(1); ent.push_back(edges[i]); + } + } for(unsigned int i = 0; i < faces.size(); i++){ if(faces[i]->getSelection() != 1){ - faces[i]->setSelection(1); - fac.push_back(faces[i]); + faces[i]->setSelection(1); ent.push_back(faces[i]); + } + } + for(unsigned int i = 0; i < regions.size(); i++){ + if(regions[i]->getSelection() != 1){ + regions[i]->setSelection(1); ent.push_back(regions[i]); } } } @@ -3566,8 +3590,12 @@ void mesh_delete_parts_cb(CALLBACK_ARGS) elements[i]->setVisibility(1); } else{ + for(unsigned int i = 0; i < edges.size(); i++) + edges[i]->setSelection(0); for(unsigned int i = 0; i < faces.size(); i++) faces[i]->setSelection(0); + for(unsigned int i = 0; i < regions.size(); i++) + regions[i]->setSelection(0); } } if(ib == 'u') { @@ -3578,9 +3606,9 @@ void mesh_delete_parts_cb(CALLBACK_ARGS) } } else{ - if(fac.size()){ - fac[fac.size() - 1]->setSelection(0); - fac.pop_back(); + if(ent.size()){ + ent[ent.size() - 1]->setSelection(0); + ent.pop_back(); } } } @@ -3590,12 +3618,12 @@ void mesh_delete_parts_cb(CALLBACK_ARGS) if(ele[i]->getVisibility() == 2) ele[i]->setVisibility(0); } else{ - for(unsigned int i = 0; i < fac.size(); i++) - if(fac[i]->getSelection() == 1) fac[i]->setVisibility(0); + for(unsigned int i = 0; i < ent.size(); i++) + if(ent[i]->getSelection() == 1) ent[i]->setVisibility(0); } - GMODEL->removeInvisible(); + GMODEL->removeInvisibleElements(); ele.clear(); - fac.clear(); + ent.clear(); } if(ib == 'q') { ZeroHighlight(); @@ -3603,8 +3631,8 @@ void mesh_delete_parts_cb(CALLBACK_ARGS) } } - CTX.pick_elements = 0; CTX.mesh.changed = ENT_ALL; + CTX.pick_elements = 0; Draw(); Msg(ONSCREEN, ""); } diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp index 17f7ff5f08a5c7b51d35f3b2bf078aead31f8783..9aab3e8223dd3147ad524cd419b763220e86236e 100644 --- a/Fltk/GUI.cpp +++ b/Fltk/GUI.cpp @@ -1,4 +1,4 @@ -// $Id: GUI.cpp,v 1.559 2006-11-04 15:21:32 geuzaine Exp $ +// $Id: GUI.cpp,v 1.560 2006-11-05 18:02:59 geuzaine Exp $ // // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle // @@ -346,7 +346,9 @@ Context_Item menu_mesh[] = { Context_Item menu_mesh_delete[] = { {"1Mesh>Edit>Delete", NULL} , {"Elements", (Fl_Callback *)mesh_delete_parts_cb, (void*)"elements"} , + {"Lines", (Fl_Callback *)mesh_delete_parts_cb, (void*)"lines"} , {"Surfaces", (Fl_Callback *)mesh_delete_parts_cb, (void*)"surfaces"} , + {"Volumes", (Fl_Callback *)mesh_delete_parts_cb, (void*)"volumes"} , {0} }; Context_Item menu_mesh_define[] = { diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp index ce5f393cd01249b3045268e5efbdf9e7663e78a9..4c430b0337bfe20530e1aa0925b9695ce8a98dc5 100644 --- a/Geo/GModel.cpp +++ b/Geo/GModel.cpp @@ -1,4 +1,4 @@ -// $Id: GModel.cpp,v 1.20 2006-11-03 00:41:15 geuzaine Exp $ +// $Id: GModel.cpp,v 1.21 2006-11-05 18:03:00 geuzaine Exp $ // // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle // @@ -20,6 +20,7 @@ // Please report all bugs and problems to <gmsh@geuz.org>. #include "GModel.h" +#include "MRep.h" void GModel::destroy() { @@ -82,56 +83,40 @@ GVertex * GModel::vertexByTag(int n) const } template <class T> -static void removeInvisibleElements(std::vector<T*> &elements) +static void removeInvisible(std::vector<T*> &elements, bool all) { std::vector<T*> tmp; for(unsigned int i = 0; i < elements.size(); i++){ - if(elements[i]->getVisibility()) - tmp.push_back(elements[i]); - else + if(all || !elements[i]->getVisibility()) delete elements[i]; + else + tmp.push_back(elements[i]); } - if(tmp.size() < elements.size()){ - elements.clear(); - elements = tmp; - } + elements.clear(); + elements = tmp; } -void GModel::removeInvisible() +void GModel::removeInvisibleElements() { for(riter it = firstRegion(); it != lastRegion(); ++it){ - removeInvisibleElements((*it)->tetrahedra); - removeInvisibleElements((*it)->hexahedra); - removeInvisibleElements((*it)->prisms); - removeInvisibleElements((*it)->pyramids); + bool all = !(*it)->getVisibility(); + removeInvisible((*it)->tetrahedra, all); + removeInvisible((*it)->hexahedra, all); + removeInvisible((*it)->prisms, all); + removeInvisible((*it)->pyramids, all); + if((*it)->meshRep) (*it)->meshRep->destroy(); } for(fiter it = firstFace(); it != lastFace(); ++it){ - removeInvisibleElements((*it)->triangles); - removeInvisibleElements((*it)->quadrangles); + bool all = !(*it)->getVisibility(); + removeInvisible((*it)->triangles, all); + removeInvisible((*it)->quadrangles, all); + if((*it)->meshRep) (*it)->meshRep->destroy(); } for(eiter it = firstEdge(); it != lastEdge(); ++it){ - removeInvisibleElements((*it)->lines); + bool all = !(*it)->getVisibility(); + removeInvisible((*it)->lines, all); + if((*it)->meshRep) (*it)->meshRep->destroy(); } - - std::vector<GRegion*> r; - for(riter it = firstRegion(); it != lastRegion(); ++it) - if(!(*it)->getVisibility()) r.push_back(*it); - for(unsigned int i = 0; i < r.size(); i++){ remove(r[i]); delete r[i]; } - - std::vector<GFace*> f; - for(fiter it = firstFace(); it != lastFace(); ++it) - if(!(*it)->getVisibility()) f.push_back(*it); - for(unsigned int i = 0; i < f.size(); i++){ remove(f[i]); delete f[i]; } - - std::vector<GEdge*> e; - for(eiter it = firstEdge(); it != lastEdge(); ++it) - if(!(*it)->getVisibility()) e.push_back(*it); - for(unsigned int i = 0; i < e.size(); i++){ remove(e[i]); delete e[i]; } - - std::vector<GVertex*> v; - for(viter it = firstVertex(); it != lastVertex(); ++it) - if(!(*it)->getVisibility()) v.push_back(*it); - for(unsigned int i = 0; i < v.size(); i++){ remove(v[i]); delete v[i]; } } int GModel::renumberMeshVertices() diff --git a/Geo/GModel.h b/Geo/GModel.h index ffcf7ee62b6dd0ee945b071cb8e1d7a9568a194b..b2809b01fa825e0d814947f44b19ea8bcd2d275c 100644 --- a/Geo/GModel.h +++ b/Geo/GModel.h @@ -91,12 +91,12 @@ class GModel void remove(GEdge *e) { edges.erase(std::find(firstEdge(), lastEdge(), e)); } void remove(GVertex *v) { vertices.erase(std::find(firstVertex(), lastVertex(), v)); } - // Deletes all invisble entities and mesh elements - void removeInvisible(); - // Renumber all the mesh vertices in a continuous sequence int renumberMeshVertices(); + // Deletes all invisble mesh elements + void removeInvisibleElements(); + // Checks if there are no physical entities in the model bool noPhysicalGroups();