diff --git a/Fltk/inputRegion.cpp b/Fltk/inputRegion.cpp index 701e2597b418debd3d01e37633519186e81cc53b..a40857cd4d90613ff3efb53d71b99fc643977023 100644 --- a/Fltk/inputRegion.cpp +++ b/Fltk/inputRegion.cpp @@ -9,6 +9,7 @@ #include "inputRegion.h" #include "FlGui.h" #include "drawContext.h" +#include "GModel.h" #include "GRegion.h" #include "GFace.h" #include "GEdge.h" @@ -23,55 +24,73 @@ static std::string num2str(int num) return tmp.str(); } -void inputRegion::_region_butt_cb(Fl_Widget *w, void *data) +static std::vector<GEntity*> getSelectedEntities() +{ + // only return highest dimension matches + std::vector<GEntity*> entities; + if(FlGui::instance()->selectedRegions.size()) + for(unsigned int i = 0; i < FlGui::instance()->selectedRegions.size(); i++) + entities.push_back(FlGui::instance()->selectedRegions[i]); + else if(FlGui::instance()->selectedFaces.size()) + for(unsigned int i = 0; i < FlGui::instance()->selectedFaces.size(); i++) + entities.push_back(FlGui::instance()->selectedFaces[i]); + else if(FlGui::instance()->selectedEdges.size()) + for(unsigned int i = 0; i < FlGui::instance()->selectedEdges.size(); i++) + entities.push_back(FlGui::instance()->selectedEdges[i]); + else if(FlGui::instance()->selectedVertices.size()) + for(unsigned int i = 0; i < FlGui::instance()->selectedVertices.size(); i++) + entities.push_back(FlGui::instance()->selectedVertices[i]); + return entities; +} + +static void highlightPhysicals(const std::vector<GEntity*> &entities) +{ + int dim = -1; + std::set<int> phys; + for(unsigned int i = 0; i < entities.size(); i++){ + phys.insert(entities[i]->physicals.begin(), entities[i]->physicals.end()); + dim = entities[i]->dim(); + } + if(dim < 0) return; + + // color selected physicals + std::map<int, std::vector<GEntity*> > groups[4]; + GModel::current()->getPhysicalGroups(groups); + for(std::set<int>::iterator it = phys.begin(); it != phys.end(); it++) + for(unsigned int j = 0; j < groups[dim][*it].size(); j++) + groups[dim][*it][j]->setSelection(1); + drawContext::global()->draw(); +} + +void inputRegion::_add_butt_cb(Fl_Widget *w, void *data) { inputRegion *b = (inputRegion*)data; - + int oldp = opt_geometry_points(0, GMSH_GET, 0); int oldl = opt_geometry_lines(0, GMSH_GET, 0); int olds = opt_geometry_surfaces(0, GMSH_GET, 0); int oldv = opt_geometry_volumes(0, GMSH_GET, 0); - + opt_geometry_points(0, GMSH_SET | GMSH_GUI, 1); opt_geometry_lines(0, GMSH_SET | GMSH_GUI, 1); opt_geometry_surfaces(0, GMSH_SET | GMSH_GUI, 1); opt_geometry_volumes(0, GMSH_SET | GMSH_GUI, 1); drawContext::global()->draw(); - - std::set<std::string> physicals = b->value(); + + int dim = ENT_ALL; // TODO use onelab::region::dim + Msg::StatusBar(3, false, "Select entities\n[Press 'e' to end]"); while(1){ - char ib = FlGui::instance()->selectEntity(ENT_ALL); + char ib = FlGui::instance()->selectEntity(dim); if(ib == 'l'){ - if(FlGui::instance()->selectedRegions.size()){ - for(unsigned int i = 0; i < FlGui::instance()->selectedRegions.size(); i++){ - GRegion *gr = FlGui::instance()->selectedRegions[i]; - for(unsigned int j = 0; j < gr->physicals.size(); j++) - physicals.insert(num2str(gr->physicals[j])); - } + std::vector<GEntity*> selected = getSelectedEntities(); + highlightPhysicals(selected); + std::set<std::string> current = b->value(); + for(unsigned int i = 0; i < selected.size(); i++){ + for(unsigned int j = 0; j < selected[i]->physicals.size(); j++) + current.insert(num2str(selected[i]->physicals[j])); } - if(FlGui::instance()->selectedFaces.size()){ - for(unsigned int i = 0; i < FlGui::instance()->selectedFaces.size(); i++){ - GFace *gr = FlGui::instance()->selectedFaces[i]; - for(unsigned int j = 0; j < gr->physicals.size(); j++) - physicals.insert(num2str(gr->physicals[j])); - } - } - if(FlGui::instance()->selectedEdges.size()){ - for(unsigned int i = 0; i < FlGui::instance()->selectedEdges.size(); i++){ - GEdge *gr = FlGui::instance()->selectedEdges[i]; - for(unsigned int j = 0; j < gr->physicals.size(); j++) - physicals.insert(num2str(gr->physicals[j])); - } - } - if(FlGui::instance()->selectedVertices.size()){ - for(unsigned int i = 0; i < FlGui::instance()->selectedVertices.size(); i++){ - GVertex *gr = FlGui::instance()->selectedVertices[i]; - for(unsigned int j = 0; j < gr->physicals.size(); j++) - physicals.insert(num2str(gr->physicals[j])); - } - } - b->value(physicals); + b->value(current); } else if(ib == 'e' || ib == 'q'){ break; @@ -80,7 +99,8 @@ void inputRegion::_region_butt_cb(Fl_Widget *w, void *data) Msg::StatusBar(3, false, ""); b->do_callback(); - + + GModel::current()->setSelection(0); opt_geometry_points(0, GMSH_SET | GMSH_GUI, oldp); opt_geometry_lines(0, GMSH_SET | GMSH_GUI, oldl); opt_geometry_surfaces(0, GMSH_SET | GMSH_GUI, olds); diff --git a/Fltk/inputRegion.h b/Fltk/inputRegion.h index a2b8090175d2762de3151e9c061bfe86aac1eb10..a676a2c8efc0ba0d83f94bc16e5103d654d6bc70 100644 --- a/Fltk/inputRegion.h +++ b/Fltk/inputRegion.h @@ -23,13 +23,13 @@ class inputRegion : public Fl_Group { private: Fl_Input *_input; - Fl_Button *_region_butt; + Fl_Button *_add_butt; static void _input_cb(Fl_Widget *w, void *data) { inputRegion *b = (inputRegion*)data; b->do_callback(); } - static void _region_butt_cb(Fl_Widget *w, void *data); + static void _add_butt_cb(Fl_Widget *w, void *data); std::string _set2string(const std::set<std::string> &s) { std::string out; @@ -72,12 +72,12 @@ class inputRegion : public Fl_Group { _input->callback(_input_cb, this); _input->when(FL_WHEN_ENTER_KEY|FL_WHEN_RELEASE); - _region_butt = new Fl_Button(x + input_w, y, butt_w, h, "+"); - _region_butt->callback(_region_butt_cb, this); - _region_butt->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE); - _region_butt->tooltip("Interactive region selection"); + _add_butt = new Fl_Button(x + input_w, y, butt_w, h, "+"); + _add_butt->callback(_add_butt_cb, this); + _add_butt->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE); + _add_butt->tooltip("Add region interactively"); - if(readOnly) _region_butt->deactivate(); + if(readOnly) _add_butt->deactivate(); end(); // close the group resizable(_input);