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

Extend visibility browser so that we can apply choices on all loaded models at once

parent 6cc19b5d
No related branches found
No related tags found
No related merge requests found
...@@ -50,7 +50,8 @@ class Vis { ...@@ -50,7 +50,8 @@ class Vis {
virtual std::string getName() const { return _name; } virtual std::string getName() const { return _name; }
virtual std::string getType() const = 0; virtual std::string getType() const = 0;
virtual char getVisibility() 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 { class VisModel : public Vis {
...@@ -64,9 +65,29 @@ class VisModel : public Vis { ...@@ -64,9 +65,29 @@ class VisModel : public Vis {
int getTag() const { return _tag; } int getTag() const { return _tag; }
std::string getType() const { return "Model"; } std::string getType() const { return "Model"; }
char getVisibility() const { return _model->getVisibility(); } 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 { class VisElementary : public Vis {
private: private:
GEntity *_e; GEntity *_e;
...@@ -83,9 +104,11 @@ class VisElementary : public Vis { ...@@ -83,9 +104,11 @@ class VisElementary : public Vis {
else return "Volume"; else return "Volume";
} }
char getVisibility() const { return _e->getVisibility(); } 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); _e->setVisibility(val, recursive);
if(allmodels)
setVisibilityOnOtherModels(_e, val, recursive);
} }
}; };
...@@ -108,11 +131,14 @@ class VisPhysical : public Vis { ...@@ -108,11 +131,14 @@ class VisPhysical : public Vis {
else return "Volume"; else return "Volume";
} }
char getVisibility() const { return _visible; } char getVisibility() const { return _visible; }
void setVisibility(char val, bool recursive=false) void setVisibility(char val, bool recursive=false, bool allmodels=false)
{ {
_visible = val; _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); _list[i]->setVisibility(val, recursive);
if(allmodels)
setVisibilityOnOtherModels(_list[i], val, recursive);
}
} }
}; };
...@@ -126,16 +152,20 @@ class VisPartition : public Vis { ...@@ -126,16 +152,20 @@ class VisPartition : public Vis {
int getTag() const { return _tag; } int getTag() const { return _tag; }
std::string getType() const { return "Partition"; } std::string getType() const { return "Partition"; }
char getVisibility() const { return _visible; } 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; _visible = 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; std::vector<GEntity*> entities;
m->getEntities(entities); m->getEntities(entities);
for(unsigned int i = 0; i < entities.size(); i++) for(unsigned int j = 0; j < entities.size(); j++)
for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++) for(unsigned int k = 0; k < entities[j]->getNumMeshElements(); k++)
if(entities[i]->getMeshElement(j)->getPartition() == _tag) if(entities[j]->getMeshElement(k)->getPartition() == _tag)
entities[i]->getMeshElement(j)->setVisibility(val); entities[j]->getMeshElement(k)->setVisibility(val);
}
}
} }
}; };
...@@ -231,12 +261,12 @@ class VisibilityList { // singleton ...@@ -231,12 +261,12 @@ class VisibilityList { // singleton
// get the visibility information for the nth entity in the list // get the visibility information for the nth entity in the list
char getVisibility(int n){ return _entities[n]->getVisibility(); } char getVisibility(int n){ return _entities[n]->getVisibility(); }
// set the visibility information for the nth entity in the list // 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 // set all entities to be invisible
void setAllInvisible(VisibilityType type) void setAllInvisible(VisibilityType type, bool allmodels=false)
{ {
if(type == Models){ if(type == Models){
for(unsigned int i = 0; i < GModel::list.size(); i++) for(unsigned int i = 0; i < GModel::list.size(); i++)
...@@ -244,10 +274,15 @@ class VisibilityList { // singleton ...@@ -244,10 +274,15 @@ class VisibilityList { // singleton
} }
else if(type == ElementaryEntities || type == PhysicalEntities){ else if(type == ElementaryEntities || type == PhysicalEntities){
// elementary or physical mode: set all entities in the model invisible // elementary or physical mode: set all entities in the model invisible
for(unsigned int i = 0; i < GModel::list.size(); i++){
GModel *m = GModel::list[i];
if(allmodels || m == GModel::current()){
std::vector<GEntity*> entities; std::vector<GEntity*> entities;
GModel::current()->getEntities(entities); m->getEntities(entities);
for(unsigned int i = 0; i < entities.size(); i++) for(unsigned int j = 0; j < entities.size(); j++)
entities[i]->setVisibility(0); entities[j]->setVisibility(0);
}
}
} }
// this is superfluous in elementary mode, but we don't care // this is superfluous in elementary mode, but we don't care
for(int i = 0; i < getNumEntities(); i++) setVisibility(i, 0); 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) ...@@ -305,6 +340,7 @@ static void visibility_browser_apply_cb(Fl_Widget *w, void *data)
if(VisibilityList::instance()->getNumEntities()){ if(VisibilityList::instance()->getNumEntities()){
CTX::instance()->mesh.changed |= (ENT_LINE | ENT_SURFACE | ENT_VOLUME); CTX::instance()->mesh.changed |= (ENT_LINE | ENT_SURFACE | ENT_VOLUME);
bool recursive = FlGui::instance()->visibility->butt[0]->value() ? true : false; bool recursive = FlGui::instance()->visibility->butt[0]->value() ? true : false;
bool allmodels = FlGui::instance()->visibility->butt[1]->value() ? true : false;
VisibilityList::VisibilityType type; VisibilityList::VisibilityType type;
switch(FlGui::instance()->visibility->browser_type->value()){ switch(FlGui::instance()->visibility->browser_type->value()){
case 0: type = VisibilityList::Models; break; case 0: type = VisibilityList::Models; break;
...@@ -312,10 +348,10 @@ static void visibility_browser_apply_cb(Fl_Widget *w, void *data) ...@@ -312,10 +348,10 @@ static void visibility_browser_apply_cb(Fl_Widget *w, void *data)
case 3: type = VisibilityList::MeshPartitions; break; case 3: type = VisibilityList::MeshPartitions; break;
case 1: default: type = VisibilityList::ElementaryEntities; 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++) for(int i = 0; i < VisibilityList::instance()->getNumEntities(); i++)
if(FlGui::instance()->visibility->browser->selected(i + 1)) 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 // then refresh the browser to account for recursive selections
for(int i = 0; i < VisibilityList::instance()->getNumEntities(); i++) for(int i = 0; i < VisibilityList::instance()->getNumEntities(); i++)
if(VisibilityList::instance()->getVisibility(i)) if(VisibilityList::instance()->getVisibility(i))
...@@ -770,11 +806,14 @@ static void visibility_save_cb(Fl_Widget *w, void *data) ...@@ -770,11 +806,14 @@ static void visibility_save_cb(Fl_Widget *w, void *data)
Msg::StatusBar(2, true, "Done appending visibility info"); 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; bool all = (num < 0) ? true : false;
GModel *m = GModel::current(); for(unsigned int mod = 0; mod < GModel::list.size(); mod++){
GModel *m = GModel::list[mod];
if(allmodels || m == GModel::current()){
std::vector<GEntity*> entities; std::vector<GEntity*> entities;
m->getEntities(entities); m->getEntities(entities);
...@@ -837,6 +876,8 @@ static void _set_visibility_by_number(int what, int num, char val, bool recursiv ...@@ -837,6 +876,8 @@ static void _set_visibility_by_number(int what, int num, char val, bool recursiv
break; break;
} }
} }
}
}
static void _apply_visibility(char mode, bool physical, static void _apply_visibility(char mode, bool physical,
std::vector<GVertex*> &vertices, std::vector<GVertex*> &vertices,
...@@ -846,13 +887,14 @@ static void _apply_visibility(char mode, bool physical, ...@@ -846,13 +887,14 @@ static void _apply_visibility(char mode, bool physical,
std::vector<MElement*> &elements) std::vector<MElement*> &elements)
{ {
bool recursive = FlGui::instance()->visibility->butt[0]->value() ? true : false; 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(mode == 1){ // when showing a single entity, first hide everything
if(CTX::instance()->pickElements) if(CTX::instance()->pickElements)
_set_visibility_by_number(1, -1, 0, false); _set_visibility_by_number(1, -1, 0, false, allmodels);
else else
for(int i = 2; i <= 5; i++) 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; if(mode == 2) mode = 1;
...@@ -867,28 +909,32 @@ static void _apply_visibility(char mode, bool physical, ...@@ -867,28 +909,32 @@ static void _apply_visibility(char mode, bool physical,
vertices[i]->setVisibility(mode, recursive); vertices[i]->setVisibility(mode, recursive);
else else
for(unsigned int j = 0; j < vertices[i]->physicals.size(); j++) 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++){ for(unsigned int i = 0; i < edges.size(); i++){
if(!physical) if(!physical)
edges[i]->setVisibility(mode, recursive); edges[i]->setVisibility(mode, recursive);
else else
for(unsigned int j = 0; j < edges[i]->physicals.size(); j++) 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++){ for(unsigned int i = 0; i < faces.size(); i++){
if(!physical) if(!physical)
faces[i]->setVisibility(mode, recursive); faces[i]->setVisibility(mode, recursive);
else else
for(unsigned int j = 0; j < faces[i]->physicals.size(); j++) 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++){ for(unsigned int i = 0; i < regions.size(); i++){
if(!physical) if(!physical)
regions[i]->setVisibility(mode, recursive); regions[i]->setVisibility(mode, recursive);
else else
for(unsigned int j = 0; j < regions[i]->physicals.size(); j++) 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(); int pos = FlGui::instance()->visibility->browser->position();
...@@ -917,8 +963,9 @@ static void visibility_number_cb(Fl_Widget *w, void *data) ...@@ -917,8 +963,9 @@ static void visibility_number_cb(Fl_Widget *w, void *data)
int num = (!strcmp(str, "all") || !strcmp(str, "*")) ? -1 : atoi(str); int num = (!strcmp(str, "all") || !strcmp(str, "*")) ? -1 : atoi(str);
bool recursive = FlGui::instance()->visibility->butt[0]->value() ? true : false; 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(); int pos = FlGui::instance()->visibility->browser->position();
visibility_cb(NULL, (void*)"redraw_only"); visibility_cb(NULL, (void*)"redraw_only");
...@@ -996,8 +1043,9 @@ static void visibility_interactive_cb(Fl_Widget *w, void *data) ...@@ -996,8 +1043,9 @@ static void visibility_interactive_cb(Fl_Widget *w, void *data)
opt_geometry_volumes(0, GMSH_SET | GMSH_GUI, 1); opt_geometry_volumes(0, GMSH_SET | GMSH_GUI, 1);
} }
else if(str == "show all"){ 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 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; CTX::instance()->mesh.changed = ENT_ALL;
drawContext::global()->draw(); drawContext::global()->draw();
return; return;
...@@ -1356,14 +1404,24 @@ visibilityWindow::visibilityWindow(int deltaFontSize) ...@@ -1356,14 +1404,24 @@ visibilityWindow::visibilityWindow(int deltaFontSize)
win->size_range(width, 15 * BH + 5 * WB, width); 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 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]->type(FL_TOGGLE_BUTTON);
butt[0]->value(1); 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 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); o1->callback(visibility_save_cb);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment