diff --git a/Fltk/visibilityWindow.cpp b/Fltk/visibilityWindow.cpp index 591ba97018e5d746cea8580489a943c6cd633836..d7071028c0789364ab79ac3004898a96d9379fbb 100644 --- a/Fltk/visibilityWindow.cpp +++ b/Fltk/visibilityWindow.cpp @@ -50,7 +50,8 @@ class Vis { virtual std::string getName() const { return _name; } virtual std::string getType() const = 0; virtual char getVisibility() const = 0; - virtual void setVisibility(char val, bool recursive=false) = 0; + virtual void setVisibility(char val, bool recursive=false, + bool allmodels=false) = 0; }; class VisModel : public Vis { @@ -64,9 +65,29 @@ class VisModel : public Vis { int getTag() const { return _tag; } std::string getType() const { return "Model"; } char getVisibility() const { return _model->getVisibility(); } - void setVisibility(char val, bool recursive=false){ _model->setVisibility(val); } + void setVisibility(char val, bool recursive=false, bool allmodels=false) + { + _model->setVisibility(val); + } }; +static void setVisibilityOnOtherModels(GEntity *ge, char val, bool recursive) +{ + for(unsigned int i = 0; i < GModel::list.size(); i++){ + GModel *m2 = GModel::list[i]; + if(m2 != ge->model()){ + GEntity *ge2 = 0; + switch(ge->dim()){ + case 0: ge2 = m2->getVertexByTag(ge->tag()); break; + case 1: ge2 = m2->getEdgeByTag(ge->tag()); break; + case 2: ge2 = m2->getFaceByTag(ge->tag()); break; + case 3: ge2 = m2->getRegionByTag(ge->tag()); break; + } + if(ge2) ge2->setVisibility(val, recursive); + } + } +} + class VisElementary : public Vis { private: GEntity *_e; @@ -83,9 +104,11 @@ class VisElementary : public Vis { else return "Volume"; } char getVisibility() const { return _e->getVisibility(); } - void setVisibility(char val, bool recursive=false) + void setVisibility(char val, bool recursive=false, bool allmodels=false) { _e->setVisibility(val, recursive); + if(allmodels) + setVisibilityOnOtherModels(_e, val, recursive); } }; @@ -108,11 +131,14 @@ class VisPhysical : public Vis { else return "Volume"; } char getVisibility() const { return _visible; } - void setVisibility(char val, bool recursive=false) + void setVisibility(char val, bool recursive=false, bool allmodels=false) { _visible = val; - for(unsigned int i = 0; i < _list.size(); i++) + for(unsigned int i = 0; i < _list.size(); i++){ _list[i]->setVisibility(val, recursive); + if(allmodels) + setVisibilityOnOtherModels(_list[i], val, recursive); + } } }; @@ -126,16 +152,20 @@ class VisPartition : public Vis { int getTag() const { return _tag; } std::string getType() const { return "Partition"; } char getVisibility() const { return _visible; } - void setVisibility(char val, bool recursive=false) + void setVisibility(char val, bool recursive=false, bool allmodels=false) { - GModel *m = GModel::current(); _visible = val; - std::vector<GEntity*> entities; - m->getEntities(entities); - for(unsigned int i = 0; i < entities.size(); i++) - for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++) - if(entities[i]->getMeshElement(j)->getPartition() == _tag) - entities[i]->getMeshElement(j)->setVisibility(val); + for(unsigned int i = 0; i < GModel::list.size(); i++){ + GModel *m = GModel::list[i]; + if(allmodels || m == GModel::current()){ + std::vector<GEntity*> entities; + m->getEntities(entities); + for(unsigned int j = 0; j < entities.size(); j++) + for(unsigned int k = 0; k < entities[j]->getNumMeshElements(); k++) + if(entities[j]->getMeshElement(k)->getPartition() == _tag) + entities[j]->getMeshElement(k)->setVisibility(val); + } + } } }; @@ -231,12 +261,12 @@ class VisibilityList { // singleton // get the visibility information for the nth entity in the list char getVisibility(int n){ return _entities[n]->getVisibility(); } // set the visibility information for the nth entity in the list - void setVisibility(int n, char val, bool recursive=false) + void setVisibility(int n, char val, bool recursive=false, bool allmodels=false) { - _entities[n]->setVisibility(val, recursive); + _entities[n]->setVisibility(val, recursive, allmodels); } // set all entities to be invisible - void setAllInvisible(VisibilityType type) + void setAllInvisible(VisibilityType type, bool allmodels=false) { if(type == Models){ for(unsigned int i = 0; i < GModel::list.size(); i++) @@ -244,10 +274,15 @@ class VisibilityList { // singleton } else if(type == ElementaryEntities || type == PhysicalEntities){ // elementary or physical mode: set all entities in the model invisible - std::vector<GEntity*> entities; - GModel::current()->getEntities(entities); - for(unsigned int i = 0; i < entities.size(); i++) - entities[i]->setVisibility(0); + for(unsigned int i = 0; i < GModel::list.size(); i++){ + GModel *m = GModel::list[i]; + if(allmodels || m == GModel::current()){ + std::vector<GEntity*> entities; + m->getEntities(entities); + for(unsigned int j = 0; j < entities.size(); j++) + entities[j]->setVisibility(0); + } + } } // this is superfluous in elementary mode, but we don't care for(int i = 0; i < getNumEntities(); i++) setVisibility(i, 0); @@ -305,6 +340,7 @@ static void visibility_browser_apply_cb(Fl_Widget *w, void *data) if(VisibilityList::instance()->getNumEntities()){ CTX::instance()->mesh.changed |= (ENT_LINE | ENT_SURFACE | ENT_VOLUME); bool recursive = FlGui::instance()->visibility->butt[0]->value() ? true : false; + bool allmodels = FlGui::instance()->visibility->butt[1]->value() ? true : false; VisibilityList::VisibilityType type; switch(FlGui::instance()->visibility->browser_type->value()){ case 0: type = VisibilityList::Models; break; @@ -312,10 +348,10 @@ static void visibility_browser_apply_cb(Fl_Widget *w, void *data) case 3: type = VisibilityList::MeshPartitions; break; case 1: default: type = VisibilityList::ElementaryEntities; break; } - VisibilityList::instance()->setAllInvisible(type); + VisibilityList::instance()->setAllInvisible(type, allmodels); for(int i = 0; i < VisibilityList::instance()->getNumEntities(); i++) if(FlGui::instance()->visibility->browser->selected(i + 1)) - VisibilityList::instance()->setVisibility(i, 1, recursive); + VisibilityList::instance()->setVisibility(i, 1, recursive, allmodels); // then refresh the browser to account for recursive selections for(int i = 0; i < VisibilityList::instance()->getNumEntities(); i++) if(VisibilityList::instance()->getVisibility(i)) @@ -770,71 +806,76 @@ static void visibility_save_cb(Fl_Widget *w, void *data) Msg::StatusBar(2, true, "Done appending visibility info"); } -static void _set_visibility_by_number(int what, int num, char val, bool recursive) +static void _set_visibility_by_number(int what, int num, char val, bool recursive, + bool allmodels) { bool all = (num < 0) ? true : false; - GModel *m = GModel::current(); - std::vector<GEntity*> entities; - m->getEntities(entities); - - switch(what){ - case 0: // nodes - for(unsigned int i = 0; i < entities.size(); i++){ - for(unsigned int j = 0; j < entities[i]->mesh_vertices.size(); j++){ - MVertex *v = entities[i]->mesh_vertices[j]; - if(all || v->getNum() == num) v->setVisibility(val); - } - } - break; - case 1: // elements - for(unsigned int i = 0; i < entities.size(); i++){ - for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++){ - MElement *e = entities[i]->getMeshElement(j); - if(all || e->getNum() == num) e->setVisibility(val); + for(unsigned int mod = 0; mod < GModel::list.size(); mod++){ + GModel *m = GModel::list[mod]; + if(allmodels || m == GModel::current()){ + std::vector<GEntity*> entities; + m->getEntities(entities); + + switch(what){ + case 0: // nodes + for(unsigned int i = 0; i < entities.size(); i++){ + for(unsigned int j = 0; j < entities[i]->mesh_vertices.size(); j++){ + MVertex *v = entities[i]->mesh_vertices[j]; + if(all || v->getNum() == num) v->setVisibility(val); + } + } + break; + case 1: // elements + for(unsigned int i = 0; i < entities.size(); i++){ + for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++){ + MElement *e = entities[i]->getMeshElement(j); + if(all || e->getNum() == num) e->setVisibility(val); + } + } + break; + case 2: // point + for(GModel::viter it = m->firstVertex(); it != m->lastVertex(); it++) + if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive); + break; + case 3: // line + for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); it++) + if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive); + break; + case 4: // surface + for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++) + if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive); + break; + case 5: // volume + for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); it++) + if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive); + break; + case 6: // physical point + for(GModel::viter it = m->firstVertex(); it != m->lastVertex(); it++) + for(unsigned int i = 0; i < (*it)->physicals.size(); i++) + if (all || std::abs((*it)->physicals[i]) == num) + (*it)->setVisibility(val, recursive); + break; + case 7: // physical line + for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); it++) + for(unsigned int i = 0; i < (*it)->physicals.size(); i++) + if (all || std::abs((*it)->physicals[i]) == num) + (*it)->setVisibility(val, recursive); + break; + case 8: // physical surface + for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++) + for(unsigned int i = 0; i < (*it)->physicals.size(); i++) + if (all || std::abs((*it)->physicals[i]) == num) + (*it)->setVisibility(val, recursive); + break; + case 9: // physical volume + for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); it++) + for(unsigned int i = 0; i < (*it)->physicals.size(); i++) + if (all || std::abs((*it)->physicals[i]) == num) + (*it)->setVisibility(val, recursive); + break; } } - break; - case 2: // point - for(GModel::viter it = m->firstVertex(); it != m->lastVertex(); it++) - if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive); - break; - case 3: // line - for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); it++) - if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive); - break; - case 4: // surface - for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++) - if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive); - break; - case 5: // volume - for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); it++) - if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive); - break; - case 6: // physical point - for(GModel::viter it = m->firstVertex(); it != m->lastVertex(); it++) - for(unsigned int i = 0; i < (*it)->physicals.size(); i++) - if (all || std::abs((*it)->physicals[i]) == num) - (*it)->setVisibility(val, recursive); - break; - case 7: // physical line - for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); it++) - for(unsigned int i = 0; i < (*it)->physicals.size(); i++) - if (all || std::abs((*it)->physicals[i]) == num) - (*it)->setVisibility(val, recursive); - break; - case 8: // physical surface - for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++) - for(unsigned int i = 0; i < (*it)->physicals.size(); i++) - if (all || std::abs((*it)->physicals[i]) == num) - (*it)->setVisibility(val, recursive); - break; - case 9: // physical volume - for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); it++) - for(unsigned int i = 0; i < (*it)->physicals.size(); i++) - if (all || std::abs((*it)->physicals[i]) == num) - (*it)->setVisibility(val, recursive); - break; } } @@ -846,13 +887,14 @@ static void _apply_visibility(char mode, bool physical, std::vector<MElement*> &elements) { bool recursive = FlGui::instance()->visibility->butt[0]->value() ? true : false; + bool allmodels = FlGui::instance()->visibility->butt[1]->value() ? true : false; if(mode == 1){ // when showing a single entity, first hide everything if(CTX::instance()->pickElements) - _set_visibility_by_number(1, -1, 0, false); + _set_visibility_by_number(1, -1, 0, false, allmodels); else for(int i = 2; i <= 5; i++) - _set_visibility_by_number(i, -1, 0, false); + _set_visibility_by_number(i, -1, 0, false, allmodels); } if(mode == 2) mode = 1; @@ -867,28 +909,32 @@ static void _apply_visibility(char mode, bool physical, vertices[i]->setVisibility(mode, recursive); else for(unsigned int j = 0; j < vertices[i]->physicals.size(); j++) - _set_visibility_by_number(6, vertices[i]->physicals[j], mode, recursive); + _set_visibility_by_number(6, vertices[i]->physicals[j], mode, + recursive, allmodels); } for(unsigned int i = 0; i < edges.size(); i++){ if(!physical) edges[i]->setVisibility(mode, recursive); else for(unsigned int j = 0; j < edges[i]->physicals.size(); j++) - _set_visibility_by_number(7, edges[i]->physicals[j], mode, recursive); + _set_visibility_by_number(7, edges[i]->physicals[j], mode, + recursive, allmodels); } for(unsigned int i = 0; i < faces.size(); i++){ if(!physical) faces[i]->setVisibility(mode, recursive); else for(unsigned int j = 0; j < faces[i]->physicals.size(); j++) - _set_visibility_by_number(8, faces[i]->physicals[j], mode, recursive); + _set_visibility_by_number(8, faces[i]->physicals[j], mode, + recursive, allmodels); } for(unsigned int i = 0; i < regions.size(); i++){ if(!physical) regions[i]->setVisibility(mode, recursive); else for(unsigned int j = 0; j < regions[i]->physicals.size(); j++) - _set_visibility_by_number(9, regions[i]->physicals[j], mode, recursive); + _set_visibility_by_number(9, regions[i]->physicals[j], mode, + recursive, allmodels); } } int pos = FlGui::instance()->visibility->browser->position(); @@ -917,8 +963,9 @@ static void visibility_number_cb(Fl_Widget *w, void *data) int num = (!strcmp(str, "all") || !strcmp(str, "*")) ? -1 : atoi(str); bool recursive = FlGui::instance()->visibility->butt[0]->value() ? true : false; + bool allmodels = FlGui::instance()->visibility->butt[1]->value() ? true : false; - _set_visibility_by_number(what, num, val, recursive); + _set_visibility_by_number(what, num, val, recursive, allmodels); int pos = FlGui::instance()->visibility->browser->position(); visibility_cb(NULL, (void*)"redraw_only"); @@ -996,8 +1043,9 @@ static void visibility_interactive_cb(Fl_Widget *w, void *data) opt_geometry_volumes(0, GMSH_SET | GMSH_GUI, 1); } else if(str == "show all"){ + bool allmodels = FlGui::instance()->visibility->butt[1]->value() ? true : false; for(int i = 1; i <= 5; i++) // elements, points, lines, surfaces, volumes - _set_visibility_by_number(i, -1, 1, false); + _set_visibility_by_number(i, -1, 1, false, allmodels); CTX::instance()->mesh.changed = ENT_ALL; drawContext::global()->draw(); return; @@ -1356,14 +1404,24 @@ visibilityWindow::visibilityWindow(int deltaFontSize) win->size_range(width, 15 * BH + 5 * WB, width); { - int ww = (width - 3 * WB) / 2; + int aw = 5 * WB; + int ww = (width - 5 * WB - aw) / 4; + + Fl_Box *b = new Fl_Box(WB, height - BH - WB, aw, BH, "Apply"); + b->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); + butt[0] = new Fl_Check_Button - (WB, height - BH - WB, ww, BH, "Set visibility recursively"); + (WB + aw + WB, height - BH - WB, ww, BH, "recursively"); butt[0]->type(FL_TOGGLE_BUTTON); butt[0]->value(1); + butt[1] = new Fl_Check_Button + (WB + aw + WB + ww, height - BH - WB, ww + WB, BH, "to all models"); + butt[1]->type(FL_TOGGLE_BUTTON); + butt[1]->value(1); + Fl_Button *o1 = new Fl_Button - (width - ww - WB, height - BH - WB, ww, BH, "Save current visibility"); + (width - 2 * ww - WB, height - BH - WB, 2 * ww, BH, "Save current visibility"); o1->callback(visibility_save_cb); }