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

jf's last changes completely f***ed the classificationEditor. Reverting to old code.

parent 90c82000
No related branches found
No related tags found
No related merge requests found
...@@ -19,6 +19,18 @@ ...@@ -19,6 +19,18 @@
#include "discreteEdge.h" #include "discreteEdge.h"
#include "discreteFace.h" #include "discreteFace.h"
extern GEdge *getNewModelEdge(GFace *gf1, GFace *gf2,
std::map<std::pair<int, int>, GEdge*> &newEdges);
extern void recurClassifyEdges(MTri3 *t, std::map<MTriangle*, GFace*> &reverse,
std::map<MLine*, GEdge*, compareMLinePtr> &lines,
std::set<MLine*> &touched, std::set<MTri3*> &trisTouched,
std::map<std::pair<int, int>, GEdge*> &newEdges);
extern void recurClassify(MTri3 *t, GFace *gf,
std::map<MLine*, GEdge*, compareMLinePtr> &lines,
std::map<MTriangle*, GFace*> &reverse);
static void NoElementsSelectedMode(classificationEditor *e) static void NoElementsSelectedMode(classificationEditor *e)
{ {
e->buttons[CLASS_BUTTON_SELECT_ELEMENTS]->activate(); e->buttons[CLASS_BUTTON_SELECT_ELEMENTS]->activate();
...@@ -290,8 +302,119 @@ static void select_surfaces_cb(Fl_Widget *w, void *data) ...@@ -290,8 +302,119 @@ static void select_surfaces_cb(Fl_Widget *w, void *data)
static void classify_cb(Fl_Widget *w, void *data) static void classify_cb(Fl_Widget *w, void *data)
{ {
classificationEditor *e = (classificationEditor*)data; classificationEditor *e = (classificationEditor*)data;
// classify faces with respect to coloured edges std::map<MLine*, GEdge*, compareMLinePtr> lines;
GModel::current()->classifyFaces(e->faces); for(GModel::eiter it = GModel::current()->firstEdge();
it != GModel::current()->lastEdge(); ++it){
for(unsigned int i = 0; i < (*it)->lines.size();i++)
lines[(*it)->lines[i]] = *it;
}
std::list<MTri3*> tris;
{
std::set<GFace*>::iterator it = e->faces.begin();
while(it != e->faces.end()){
GFace *gf = *it;
for(unsigned int i = 0; i < gf->triangles.size(); i++)
tris.push_back(new MTri3(gf->triangles[i], 0));
gf->triangles.clear();
++it;
}
}
if(tris.empty()) return;
connectTriangles(tris);
std::map<MTriangle*, GFace*> reverse;
// color all triangles
std::list<MTri3*> ::iterator it = tris.begin();
while(it != tris.end()){
if(!(*it)->isDeleted()){
discreteFace *gf = new discreteFace
(GModel::current(), GModel::current()->getMaxElementaryNumber(2) + 1);
recurClassify(*it, gf, lines, reverse);
GModel::current()->add(gf);
}
++it;
}
// color some lines
it = tris.begin();
while(it != tris.end()){
(*it)->setDeleted(false);
++it;
}
it = tris.begin();
// classify edges that are bound by different GFaces
std::map<std::pair<int, int>, GEdge*> newEdges;
std::set<MLine*> touched;
std::set<MTri3*> tritouched;
recurClassifyEdges(*it, reverse, lines, touched, tritouched, newEdges);
// check if new edges should not be splitted
// splitted if composed of several open or closed edges
for (std::map<std::pair<int, int>, GEdge*>::iterator it = newEdges.begin();
it != newEdges.end() ; ++it){
std::list<MLine*> segments;
for(unsigned int i = 0; i < it->second->lines.size(); i++)
segments.push_back(it->second->lines[i]);
while (!segments.empty()) {
std::vector<MLine*> myLines;
std::list<MLine*>::iterator it = segments.begin();
MVertex *vB = (*it)->getVertex(0);
MVertex *vE = (*it)->getVertex(1);
myLines.push_back(*it);
segments.erase(it);
it++;
for (int i = 0; i < 2; i++) {
for (std::list<MLine*>::iterator it = segments.begin();
it != segments.end(); ++it){
MVertex *v1 = (*it)->getVertex(0);
MVertex *v2 = (*it)->getVertex(1);
std::list<MLine*>::iterator itp;
if (v1 == vE){
myLines.push_back(*it);
itp = it;
it++;
segments.erase(itp);
vE = v2;
i = -1;
}
else if ( v2 == vE){
myLines.push_back(*it);
itp = it;
it++;
segments.erase(itp);
vE = v1;
i = -1;
}
if (it == segments.end()) break;
}
if (vB == vE) break;
if (segments.empty()) break;
MVertex *temp = vB;
vB = vE;
vE = temp;
}
GEdge *newGe = new discreteEdge
(GModel::current(), GModel::current()->getMaxElementaryNumber(1) + 1, 0, 0);
newGe->lines.insert(newGe->lines.end(), myLines.begin(), myLines.end());
GModel::current()->add(newGe);
}
}
for (std::map<std::pair<int, int>, GEdge*>::iterator it = newEdges.begin();
it != newEdges.end(); ++it){
GEdge *ge = it->second;
GModel::current()->remove(ge);
}
while(it != tris.end()){
delete *it;
++it;
}
// remove selected, but do not delete its elements // remove selected, but do not delete its elements
if(e->selected){ if(e->selected){
GModel::current()->remove(e->selected); GModel::current()->remove(e->selected);
......
...@@ -491,7 +491,7 @@ void partition_dialog() ...@@ -491,7 +491,7 @@ void partition_dialog()
int y = 0; int y = 0;
dlg.window = new paletteWindow dlg.window = new paletteWindow
(w, h, CTX::instance()->nonModalWindows ? true : false, "Partitioner Options"); (w, h, CTX::instance()->nonModalWindows ? true : false, "Partition");
dlg.window->box(GMSH_WINDOW_BOX); dlg.window->box(GMSH_WINDOW_BOX);
dlg.window->callback((Fl_Callback *)partition_cancel_cb, &dlg); dlg.window->callback((Fl_Callback *)partition_cancel_cb, &dlg);
......
...@@ -1997,15 +1997,7 @@ void GModel::insertRegion(GRegion *r) ...@@ -1997,15 +1997,7 @@ void GModel::insertRegion(GRegion *r)
// given a set of mesh edges, build GFaces that separate those // given a set of mesh edges, build GFaces that separate those
// edges. // edges.
struct compareMLinePtr { GEdge *getNewModelEdge(GFace *gf1, GFace *gf2,
bool operator () (MLine *l1, MLine *l2) const
{
static Less_Edge le;
return le(l1->getEdge(0), l2->getEdge(0));
}
};
static GEdge *getNewModelEdge(GFace *gf1, GFace *gf2,
std::map<std::pair<int, int>, GEdge*> &newEdges) std::map<std::pair<int, int>, GEdge*> &newEdges)
{ {
int t1 = gf1 ? gf1->tag() : -1; int t1 = gf1 ? gf1->tag() : -1;
...@@ -2028,11 +2020,9 @@ static GEdge *getNewModelEdge(GFace *gf1, GFace *gf2, ...@@ -2028,11 +2020,9 @@ static GEdge *getNewModelEdge(GFace *gf1, GFace *gf2,
return it->second; return it->second;
} }
static void recurClassifyEdges(MTri3 *t, void recurClassifyEdges(MTri3 *t, std::map<MTriangle*, GFace*> &reverse,
std::map<MTriangle*, GFace*> &reverse,
std::map<MLine*, GEdge*, compareMLinePtr> &lines, std::map<MLine*, GEdge*, compareMLinePtr> &lines,
std::set<MLine*> &touched, std::set<MLine*> &touched, std::set<MTri3*> &trisTouched,
std::set<MTri3*> &trisTouched,
std::map<std::pair<int, int>, GEdge*> &newEdges) std::map<std::pair<int, int>, GEdge*> &newEdges)
{ {
if(!t->isDeleted()){ if(!t->isDeleted()){
...@@ -2060,7 +2050,7 @@ static void recurClassifyEdges(MTri3 *t, ...@@ -2060,7 +2050,7 @@ static void recurClassifyEdges(MTri3 *t,
} }
} }
static void recurClassify(MTri3 *t, GFace *gf, void recurClassify(MTri3 *t, GFace *gf,
std::map<MLine*, GEdge*, compareMLinePtr> &lines, std::map<MLine*, GEdge*, compareMLinePtr> &lines,
std::map<MTriangle*, GFace*> &reverse) std::map<MTriangle*, GFace*> &reverse)
{ {
...@@ -2196,8 +2186,6 @@ void GModel::classifyFaces(std::set<GFace*> &_faces) ...@@ -2196,8 +2186,6 @@ void GModel::classifyFaces(std::set<GFace*> &_faces)
while(!trisTouched.empty()) while(!trisTouched.empty())
recurClassifyEdges(*trisTouched.begin(), reverse, lines, touched, trisTouched,newEdges); recurClassifyEdges(*trisTouched.begin(), reverse, lines, touched, trisTouched,newEdges);
// printf("%d new edges\n",newEdges.size());
std::map<discreteFace*,std::vector<int> > newFaceTopology; std::map<discreteFace*,std::vector<int> > newFaceTopology;
// check if new edges should not be splitted // check if new edges should not be splitted
......
...@@ -193,4 +193,12 @@ class MLineN : public MLine { ...@@ -193,4 +193,12 @@ class MLineN : public MLine {
} }
}; };
struct compareMLinePtr {
bool operator () (MLine *l1, MLine *l2) const
{
static Less_Edge le;
return le(l1->getEdge(0), l2->getEdge(0));
}
};
#endif #endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment