Skip to content
Snippets Groups Projects
Commit ab3400f0 authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

better region selection (still a lot of work to do)

parent 1530200b
No related branches found
No related tags found
No related merge requests found
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "inputRegion.h" #include "inputRegion.h"
#include "FlGui.h" #include "FlGui.h"
#include "drawContext.h" #include "drawContext.h"
#include "GModel.h"
#include "GRegion.h" #include "GRegion.h"
#include "GFace.h" #include "GFace.h"
#include "GEdge.h" #include "GEdge.h"
...@@ -23,55 +24,73 @@ static std::string num2str(int num) ...@@ -23,55 +24,73 @@ static std::string num2str(int num)
return tmp.str(); 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; inputRegion *b = (inputRegion*)data;
int oldp = opt_geometry_points(0, GMSH_GET, 0); int oldp = opt_geometry_points(0, GMSH_GET, 0);
int oldl = opt_geometry_lines(0, GMSH_GET, 0); int oldl = opt_geometry_lines(0, GMSH_GET, 0);
int olds = opt_geometry_surfaces(0, GMSH_GET, 0); int olds = opt_geometry_surfaces(0, GMSH_GET, 0);
int oldv = opt_geometry_volumes(0, GMSH_GET, 0); int oldv = opt_geometry_volumes(0, GMSH_GET, 0);
opt_geometry_points(0, GMSH_SET | GMSH_GUI, 1); opt_geometry_points(0, GMSH_SET | GMSH_GUI, 1);
opt_geometry_lines(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_surfaces(0, GMSH_SET | GMSH_GUI, 1);
opt_geometry_volumes(0, GMSH_SET | GMSH_GUI, 1); opt_geometry_volumes(0, GMSH_SET | GMSH_GUI, 1);
drawContext::global()->draw(); 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]"); Msg::StatusBar(3, false, "Select entities\n[Press 'e' to end]");
while(1){ while(1){
char ib = FlGui::instance()->selectEntity(ENT_ALL); char ib = FlGui::instance()->selectEntity(dim);
if(ib == 'l'){ if(ib == 'l'){
if(FlGui::instance()->selectedRegions.size()){ std::vector<GEntity*> selected = getSelectedEntities();
for(unsigned int i = 0; i < FlGui::instance()->selectedRegions.size(); i++){ highlightPhysicals(selected);
GRegion *gr = FlGui::instance()->selectedRegions[i]; std::set<std::string> current = b->value();
for(unsigned int j = 0; j < gr->physicals.size(); j++) for(unsigned int i = 0; i < selected.size(); i++){
physicals.insert(num2str(gr->physicals[j])); for(unsigned int j = 0; j < selected[i]->physicals.size(); j++)
} current.insert(num2str(selected[i]->physicals[j]));
} }
if(FlGui::instance()->selectedFaces.size()){ b->value(current);
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);
} }
else if(ib == 'e' || ib == 'q'){ else if(ib == 'e' || ib == 'q'){
break; break;
...@@ -80,7 +99,8 @@ void inputRegion::_region_butt_cb(Fl_Widget *w, void *data) ...@@ -80,7 +99,8 @@ void inputRegion::_region_butt_cb(Fl_Widget *w, void *data)
Msg::StatusBar(3, false, ""); Msg::StatusBar(3, false, "");
b->do_callback(); b->do_callback();
GModel::current()->setSelection(0);
opt_geometry_points(0, GMSH_SET | GMSH_GUI, oldp); opt_geometry_points(0, GMSH_SET | GMSH_GUI, oldp);
opt_geometry_lines(0, GMSH_SET | GMSH_GUI, oldl); opt_geometry_lines(0, GMSH_SET | GMSH_GUI, oldl);
opt_geometry_surfaces(0, GMSH_SET | GMSH_GUI, olds); opt_geometry_surfaces(0, GMSH_SET | GMSH_GUI, olds);
......
...@@ -23,13 +23,13 @@ ...@@ -23,13 +23,13 @@
class inputRegion : public Fl_Group { class inputRegion : public Fl_Group {
private: private:
Fl_Input *_input; Fl_Input *_input;
Fl_Button *_region_butt; Fl_Button *_add_butt;
static void _input_cb(Fl_Widget *w, void *data) static void _input_cb(Fl_Widget *w, void *data)
{ {
inputRegion *b = (inputRegion*)data; inputRegion *b = (inputRegion*)data;
b->do_callback(); 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 _set2string(const std::set<std::string> &s)
{ {
std::string out; std::string out;
...@@ -72,12 +72,12 @@ class inputRegion : public Fl_Group { ...@@ -72,12 +72,12 @@ class inputRegion : public Fl_Group {
_input->callback(_input_cb, this); _input->callback(_input_cb, this);
_input->when(FL_WHEN_ENTER_KEY|FL_WHEN_RELEASE); _input->when(FL_WHEN_ENTER_KEY|FL_WHEN_RELEASE);
_region_butt = new Fl_Button(x + input_w, y, butt_w, h, "+"); _add_butt = new Fl_Button(x + input_w, y, butt_w, h, "+");
_region_butt->callback(_region_butt_cb, this); _add_butt->callback(_add_butt_cb, this);
_region_butt->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE); _add_butt->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE);
_region_butt->tooltip("Interactive region selection"); _add_butt->tooltip("Add region interactively");
if(readOnly) _region_butt->deactivate(); if(readOnly) _add_butt->deactivate();
end(); // close the group end(); // close the group
resizable(_input); resizable(_input);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment