From 2f2267c2163fa171ed8675829fc7c35f979b5bd6 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Tue, 2 Mar 2010 13:45:13 +0000
Subject: [PATCH] rewrote classificationEditor

---
 Fltk/classificationEditor.cpp                | 1002 +++++++++---------
 Fltk/classificationEditor.h                  |   49 +-
 benchmarks/extrude/sphere_boundary_layer.geo |   22 +-
 benchmarks/stl/coupe_geom.stl.gz             |  Bin 23495 -> 21752 bytes
 4 files changed, 557 insertions(+), 516 deletions(-)

diff --git a/Fltk/classificationEditor.cpp b/Fltk/classificationEditor.cpp
index 6e1c480d82..4e130fd34a 100644
--- a/Fltk/classificationEditor.cpp
+++ b/Fltk/classificationEditor.cpp
@@ -4,7 +4,7 @@
 // bugs and problems to <gmsh@geuz.org>.
 
 #include <FL/Fl_Tabs.H>
-#include <FL/Fl_Value_Input.H>
+#include <FL/Fl_Box.H>
 #include "FlGui.h"
 #include "classificationEditor.h"
 #include "paletteWindow.h"
@@ -19,184 +19,43 @@
 #include "discreteEdge.h"
 #include "discreteFace.h"
 
-static void NoElementsSelectedMode(classificationEditor *e)
-{
-  e->_buttons[CLASSBUTTON_DEL]->deactivate();
-  e->_buttons[CLASSBUTTON_ADD]->deactivate();
-  e->_buttons[CLASSBUTTON_CLEAR]->deactivate();
-  //  e->_buttons[CLASSBUTTON_OK]->deactivate();
-  e->_togbuttons[CLASSTOGBUTTON_CLOS]->deactivate();
-  e->_inputs[CLASSVALUE_ANGLE]->deactivate();
-
-  e->_buttons[CLASSBUTTON_SELECT]->activate(); 
-  e->_togbuttons[CLASSTOGBUTTON_HIDE]->activate(); 
-}
-
-static void ElementsSelectedMode(classificationEditor *e)
-{
-  e->_buttons[CLASSBUTTON_DEL]->activate();
-  e->_buttons[CLASSBUTTON_ADD]->activate();
-  e->_buttons[CLASSBUTTON_CLEAR]->activate();
-  e->_togbuttons[CLASSTOGBUTTON_CLOS]->activate();
-  e->_inputs[CLASSVALUE_ANGLE]->activate();
-  //  e->_buttons[CLASSBUTTON_OK]->activate();
-
-  e->_buttons[CLASSBUTTON_SELECT]->deactivate(); 
-  e->_togbuttons[CLASSTOGBUTTON_HIDE]->deactivate(); 
-}
-
-// we should 
-static void class_selectgface_cb(Fl_Widget *w, void *data)
-{
-  classificationEditor *e = (classificationEditor*)data;
-  std::vector<GFace*> temp;
-
-  opt_geometry_surfaces(0, GMSH_SET | GMSH_GUI, 1);
-
-  while(1) {
-    CTX::instance()->mesh.changed = ENT_ALL;
-    drawContext::global()->draw();
-
-    Msg::StatusBar(3, false, "Select Model Face\n"
-                   "[Press 'e' to end selection or 'q' to abort]");
-    
-    char ib = FlGui::instance()->selectEntity(ENT_SURFACE);
-    if(ib == 'l') {
-      for(unsigned int i = 0; i < FlGui::instance()->selectedFaces.size(); i++){
-        FlGui::instance()->selectedFaces[i]->setSelection(1);
-        temp.push_back(FlGui::instance()->selectedFaces[i]);
-      }
-    }
-    // ok store the list of gfaces !
-    if(ib == 'e') {
-      GModel::current()->setSelection(0);
-      for(unsigned int i = 0; i < temp.size(); i++){
-        e->_faces.insert(temp[i]);
-      }
-      break;
-    }
-    // do nothing
-    if(ib == 'q') {
-      GModel::current()->setSelection(0);
-      break;
-    }
-  } 
-  CTX::instance()->mesh.changed = ENT_ALL;
-  drawContext::global()->draw();  
-  Msg::StatusBar(3, false, "");
-}
-
-static void class_deleteedge_cb(Fl_Widget *w, void *data)
+edge_angle::edge_angle(MVertex *_v1, MVertex *_v2, MElement *t1, MElement *t2)
+  : v1(_v1), v2(_v2)
 {
-  classificationEditor *e = (classificationEditor*)data;
-  std::vector<MLine*> ele;
-  
-  CTX::instance()->pickElements = 1;
-  
-  while(1) {
-    CTX::instance()->mesh.changed = ENT_ALL;
-    drawContext::global()->draw();
-
-    Msg::StatusBar(3, false, "Select Elements\n"
-                   "[Press 'e' to end selection or 'q' to abort]");
-    
-    char ib = FlGui::instance()->selectEntity(ENT_ALL);
-    if(ib == 'l') {
-      if(CTX::instance()->pickElements){
-        for(unsigned int i = 0; i < FlGui::instance()->selectedElements.size(); i++){
-          MElement *me = FlGui::instance()->selectedElements[i];
-          if(me->getType() == TYPE_LIN && me->getVisibility() != 2){
-            me->setVisibility(2); ele.push_back((MLine*)me);
-          }
-        }
-      }
-    }
-    if(ib == 'r') {
-      for(unsigned int i = 0; i < FlGui::instance()->selectedElements.size(); i++)
-        FlGui::instance()->selectedElements[i]->setVisibility(1);
-    }
-    // ok, we compute edges !
-    if(ib == 'e') {
-      GModel::current()->setSelection(0);
-      break;
-    }
-    // do nothing
-    if(ib == 'q') {
-      GModel::current()->setSelection(0);
-      ele.clear();
-      break;
+  if(!t2) angle = 0;
+  else{
+    double c1[3];
+    double c2[3];
+    double c3[3];
+    {
+      MVertex *p1 = t1->getVertex(0);
+      MVertex *p2 = t1->getVertex(1);
+      MVertex *p3 = t1->getVertex(2);
+      double a[3] = {p1->x() - p2->x(), p1->y() - p2->y(), p1->z() - p2->z()};
+      double b[3] = {p1->x() - p3->x(), p1->y() - p3->y(), p1->z() - p3->z()};
+      c1[2] = a[0] * b[1] - a[1] * b[0];
+      c1[1] = -a[0] * b[2] + a[2] * b[0];
+      c1[0] = a[1] * b[2] - a[2] * b[1];
     }
-  }
-
-  std::sort(ele.begin(),ele.end());
-  //  look in all temporary edges if a deleted one is present and delete it !
-  std::vector<MLine*> temp = e->temporary->lines;
-  e->temporary->lines.clear();
-       
-  for(unsigned int i = 0; i < temp.size(); i++){      
-    std::vector<MLine*>::iterator it = std::find(ele.begin(), ele.end(), temp[i]);
-    if(it != ele.end()){
-      delete temp[i];
+    {
+      MVertex *p1 = t2->getVertex(0);
+      MVertex *p2 = t2->getVertex(1);
+      MVertex *p3 = t2->getVertex(2);
+      double a[3] = {p1->x() - p2->x(), p1->y() - p2->y(), p1->z() - p2->z()};
+      double b[3] = {p1->x() - p3->x(), p1->y() - p3->y(), p1->z() - p3->z()};
+      c2[2] = a[0] * b[1] - a[1] * b[0];
+      c2[1] = -a[0] * b[2] + a[2] * b[0];
+      c2[0] = a[1] * b[2] - a[2] * b[1];
     }
-    else e->temporary->lines.push_back(temp[i]);
-  }
-  
-  CTX::instance()->mesh.changed = ENT_ALL;
-  CTX::instance()->pickElements = 0;
-  drawContext::global()->draw();  
-  Msg::StatusBar(3, false, "");
-}
-
-static void class_save_cb(Fl_Widget *w, void *data)
-{
-  classificationEditor *e = (classificationEditor*)data;
-
-  e->saved->lines.insert(e->saved->lines.end(), e->temporary->lines.begin(),
-                         e->temporary->lines.end());
-  e->temporary->lines.clear();
-  e->_elements.clear();
-  e->edges_detected.clear();
-
-  CTX::instance()->mesh.changed = ENT_ALL;
-  CTX::instance()->pickElements = 0;
-  NoElementsSelectedMode(e);
-  drawContext::global()->draw();  
-  Msg::StatusBar(3, false, "");
-}
-
-static void class_clear_cb(Fl_Widget *w, void *data)
-{
-  classificationEditor *e = (classificationEditor*)data;
-
-  for(unsigned int i = 0; i < e->temporary->lines.size(); i++){      
-    delete e->temporary->lines[i];
+    norme(c1);
+    norme(c2);
+    prodve(c1, c2, c3);
+    double cosa; prosca(c1, c2, &cosa);
+    double sina = norme(c3);
+    angle = atan2(sina, cosa);
   }
-  e->temporary->lines.clear();
-
-  CTX::instance()->mesh.changed = ENT_ALL;
-  CTX::instance()->pickElements = 0;
-  NoElementsSelectedMode(e);
-  drawContext::global()->draw();  
-  Msg::StatusBar(3, false, "");
 }
 
-static void class_ok_cb(Fl_Widget *w, void *data)
-{
-  classificationEditor *e = (classificationEditor*)data;
-  e->edge_detec->deactivate();
-  e->edge_detec->hide();
-  e->face_color->activate();
-  e->face_color->show();
-  class_save_cb(w,data);
-  opt_mesh_lines(0, GMSH_SET | GMSH_GUI, e->op[0]);
-  opt_mesh_surfaces_edges(0, GMSH_SET | GMSH_GUI, e->op[1]);
-  opt_mesh_surfaces_faces(0, GMSH_SET | GMSH_GUI, e->op[2]);
-  opt_mesh_line_width(0, GMSH_SET | GMSH_GUI, e->op[3]);
-
-  Msg::StatusBar(3, false, "");
-}
-
-
 struct compareMLinePtr 
 {
   bool operator () (MLine *l1, MLine *l2) const
@@ -206,6 +65,23 @@ struct compareMLinePtr
   }
 };
 
+static void buildListOfEdgeAngle(e2t_cont adj, std::vector<edge_angle> &edges_detected,
+                                 std::vector<edge_angle> &edges_lonly)
+{
+  e2t_cont::iterator it = adj.begin();
+  for(; it != adj.end(); ++it){
+    if(it->second.second)
+      edges_detected.push_back(edge_angle(it->first.getVertex(0), 
+                                          it->first.getVertex(1), 
+                                          it->second.first, it->second.second));
+    else 
+      edges_lonly.push_back(edge_angle(it->first.getVertex(0),
+                                       it->first.getVertex(1), 
+                                       it->second.first, it->second.second));
+  }
+  std::sort(edges_detected.begin(), edges_detected.end());
+}
+
 static void recurClassify(MTri3 *t, GFace *gf,
                           std::map<MLine*, GEdge*, compareMLinePtr> &lines,
                           std::map<MTriangle*, GFace*> &reverse)
@@ -232,20 +108,19 @@ static GEdge *getNewModelEdge(GFace *gf1, GFace *gf2,
 {
   int t1 = gf1 ? gf1->tag() : -1;
   int t2 = gf2 ? gf2->tag() : -1;
-  int i1 = std::min(t1,t2);
-  int i2 = std::max(t1,t2);
+  int i1 = std::min(t1, t2);
+  int i2 = std::max(t1, t2);
 
   if(i1 == i2) return 0;
 
   std::map<std::pair<int, int>, GEdge*>::iterator it = 
     newEdges.find(std::make_pair<int, int>(i1, i2));
   if(it == newEdges.end()){
-    discreteEdge *temporary = new discreteEdge
+    discreteEdge *ge = new discreteEdge
       (GModel::current(), GModel::current()->maxEdgeNum() + 1, 0, 0);
-    //printf("add new edge gf1=%d gf2=%d \n", t1, t2);
-    GModel::current()->add(temporary);
-    newEdges[std::make_pair<int, int>(i1, i2)] = temporary;
-    return temporary;
+    GModel::current()->add(ge);
+    newEdges[std::make_pair<int, int>(i1, i2)] = ge;
+    return ge;
   }
   else
     return it->second;  
@@ -258,7 +133,6 @@ static void recurClassifyEdges(MTri3 *t,
                                std::map<std::pair<int, int>, GEdge*> &newEdges)
 {
   if(!t->isDeleted()){
-
     t->setDeleted(true);
     GFace *gf1 = reverse[t->tri()];
     for(int i = 0; i < 3; i++){
@@ -279,179 +153,62 @@ static void recurClassifyEdges(MTri3 *t,
       if(tn)
         recurClassifyEdges(tn, reverse, lines, touched, newEdges);
     }
-
   }
 }
 
-static void class_color_cb(Fl_Widget* w, void* data)
+static void NoElementsSelectedMode(classificationEditor *e)
 {
-  classificationEditor *e = (classificationEditor*)data;
-  std::map<MLine*, GEdge*, compareMLinePtr> lines;
-  {
-    GModel::eiter it =  GModel::current()->firstEdge();
-    GModel::eiter ite = GModel::current()->lastEdge();
-    for( ; it != ite; ++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;
-    }
-  }
+  e->buttons[CLASS_BUTTON_SELECT_ELEMENTS]->activate(); 
+  e->buttons[CLASS_BUTTON_SELECT_ALL_ELEMENTS]->activate(); 
 
-  if ( !tris.size() )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 *temporary = new discreteFace
-          (GModel::current(), GModel::current()->maxFaceNum() + 1);
-        recurClassify(*it, temporary, lines, reverse);
-        GModel::current()->add(temporary);
-      }
-      ++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;
-    recurClassifyEdges(*it, reverse, lines, touched, newEdges);
-    GModel::current()->remove(e->saved);
-
-    //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){
-
-      GEdge *ge = it->second;
-      //printf("NEW edge with tag  = %d \n", ge->tag());
-
-      std::list<MLine*> segments;
-      for (unsigned int i = 0; i < ge->lines.size(); i++){
-        segments.push_back(ge->lines[i]);
-      }
+  e->buttons[CLASS_BUTTON_DELETE_FROM_SELECTION]->deactivate();
+  e->buttons[CLASS_BUTTON_RESET_SELECTION]->deactivate();
+  e->toggles[CLASS_TOGGLE_BOUNDARY]->deactivate();
+  e->inputs[CLASS_VALUE_ANGLE]->deactivate();
+  e->buttons[CLASS_BUTTON_CLASSIFY]->deactivate();
 
-      //for each actual GEdge
-      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++;
-        //printf("***candidate mline %d %d of size %d \n", vB->getNum(), vE->getNum(), segments.size());
-
-        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);
-            //printf("mline %d %d \n", v1->getNum(), v2->getNum());
-            std::list<MLine*>::iterator itp;
-            if ( v1 == vE  ){
-              //printf("->push back this mline \n");
-              myLines.push_back(*it);
-              itp = it;
-              it++;
-              segments.erase(itp);
-              vE = v2;
-              i = -1;
-            }
-            else if ( v2 == vE){
-              //printf("->push back this mline \n");
-              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;
-          //printf("not found VB=%d vE=%d\n", vB->getNum(), vE->getNum());
-          MVertex *temp = vB;
-          vB = vE;
-          vE = temp;
-          //printf("not found VB=%d vE=%d\n", vB->getNum(), vE->getNum());
-        }
-        GEdge *newGe = new discreteEdge
-          (GModel::current(), GModel::current()->maxEdgeNum() + 1, 0, 0);
-        newGe->lines.insert(newGe->lines.end(), myLines.begin(), myLines.end());
-        GModel::current()->add(newGe);
-      }//end for each actual GEdge
-    }
-    //printf("end new edge with tag \n");
-
-    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;
-    }
-  }
-  
   CTX::instance()->mesh.changed = ENT_ALL;
+  CTX::instance()->pickElements = 0;
   drawContext::global()->draw();  
   Msg::StatusBar(3, false, "");
 }
 
-static void updateedges_cb(Fl_Widget* w, void* data)
+static void ElementsSelectedMode(classificationEditor *e)
+{
+  e->buttons[CLASS_BUTTON_DELETE_FROM_SELECTION]->activate();
+  e->buttons[CLASS_BUTTON_RESET_SELECTION]->activate();
+  e->toggles[CLASS_TOGGLE_BOUNDARY]->activate();
+  e->inputs[CLASS_VALUE_ANGLE]->activate();
+
+  e->buttons[CLASS_BUTTON_SELECT_ELEMENTS]->deactivate(); 
+  e->buttons[CLASS_BUTTON_SELECT_ALL_ELEMENTS]->deactivate(); 
+}
+
+static void update_edges_cb(Fl_Widget *w, void *data)
 {
   classificationEditor *e = (classificationEditor*)data;
  
+  if(!e->selected) return;
+
   printf("%d inside edges detected\n", (int)e->edges_detected.size());
 
-  for(unsigned int i = 0; i < e->temporary->lines.size(); i++){
-    delete e->temporary->lines[i];
-  }
-  e->temporary->lines.clear();
+  for(unsigned int i = 0; i < e->selected->lines.size(); i++)
+    delete e->selected->lines[i];
+  e->selected->lines.clear();
 
   for(unsigned int i = 0; i < e->edges_detected.size(); i++){
     edge_angle ea =  e->edges_detected[i];
     // printf("angle = %g\n",ea.angle);
-    if(ea.angle <= e->_inputs[CLASSVALUE_ANGLE]->value() / 180 * M_PI)
+    if(ea.angle <= e->inputs[CLASS_VALUE_ANGLE]->value() / 180 * M_PI)
       break;
-    e->temporary->lines.push_back(new MLine(ea.v1, ea.v2));
+    e->selected->lines.push_back(new MLine(ea.v1, ea.v2));
   } 
 
   printf("%d boundary edges detected\n", (int)e->edges_lonly.size());
-  if(e->_togbuttons[CLASSTOGBUTTON_CLOS]->value()){
+  if(e->toggles[CLASS_TOGGLE_BOUNDARY]->value()){
     for(unsigned int i = 0 ; i < e->edges_lonly.size(); i++){
       edge_angle ea = e->edges_lonly[i];
-      e->temporary->lines.push_back(new MLine(ea.v1, ea.v2));
+      e->selected->lines.push_back(new MLine(ea.v1, ea.v2));
       //check if closed loop
     } 
   }
@@ -460,6 +217,91 @@ static void updateedges_cb(Fl_Widget* w, void* data)
   drawContext::global()->draw();   
 }
 
+static void class_select_elements_cb(Fl_Widget *w, void *data)
+{
+  classificationEditor *e = (classificationEditor*)data;
+  std::vector<MTriangle*> &ele(e->elements);
+
+  // allocate discrete edge to hold the selected mesh segments
+  if(!e->selected){
+    e->selected = new discreteEdge
+      (GModel::current(), GModel::current()->maxEdgeNum() + 1, 0, 0);
+    GModel::current()->add(e->selected);
+  }
+
+  CTX::instance()->pickElements = 1;
+
+  while(1) {
+    CTX::instance()->mesh.changed = ENT_ALL;
+    drawContext::global()->draw();
+
+    Msg::StatusBar(3, false, "Select elements\n"
+                   "[Press 'e' to end selection or 'q' to abort]");
+    
+    char ib = FlGui::instance()->selectEntity(ENT_ALL);
+    if(ib == 'l') {
+      for(unsigned int i = 0; i < FlGui::instance()->selectedElements.size(); i++){
+        MElement *me = FlGui::instance()->selectedElements[i];
+        if(me->getType() == TYPE_TRI && me->getVisibility() != 2){
+          me->setVisibility(2); ele.push_back((MTriangle*)me);
+        }
+      }
+    }
+    if(ib == 'r') {
+      for(unsigned int i = 0; i < FlGui::instance()->selectedElements.size(); i++)
+        FlGui::instance()->selectedElements[i]->setVisibility(1);
+    }
+    if(ib == 'e') { // ok, compute the edges
+      GModel::current()->setSelection(0);
+      e2t_cont adj;
+      buildEdgeToTriangle(ele, adj);
+      buildListOfEdgeAngle(adj, e->edges_detected, e->edges_lonly);
+      ElementsSelectedMode(e);
+      break;
+    }
+    if(ib == 'q') { // do nothing
+      GModel::current()->setSelection(0);
+      ele.clear();
+      break;
+    }
+  }
+  
+  update_edges_cb(0, data);
+
+  CTX::instance()->mesh.changed = ENT_ALL;
+  CTX::instance()->pickElements = 0;
+  drawContext::global()->draw();  
+  Msg::StatusBar(3, false, "");
+}
+
+static void class_select_all_elements_cb(Fl_Widget *w, void *data)
+{
+  classificationEditor *e = (classificationEditor*)data;
+
+  // allocate discrete edge to hold the selected mesh segments
+  if(!e->selected){
+    e->selected = new discreteEdge
+      (GModel::current(), GModel::current()->maxEdgeNum() + 1, 0, 0);
+    GModel::current()->add(e->selected);
+  }
+
+  for(GModel::fiter it = GModel::current()->firstFace(); 
+      it != GModel::current()->lastFace(); ++it)
+    e->elements.insert(e->elements.end(), (*it)->triangles.begin(), 
+                       (*it)->triangles.end());
+
+  e2t_cont adj;
+  buildEdgeToTriangle(e->elements, adj);
+  buildListOfEdgeAngle(adj, e->edges_detected, e->edges_lonly);
+  ElementsSelectedMode(e);
+  update_edges_cb(0, data);
+
+  CTX::instance()->mesh.changed = ENT_ALL;
+  CTX::instance()->pickElements = 0;
+  drawContext::global()->draw();  
+  Msg::StatusBar(3, false, "");
+}
+
 static void class_hide_cb(Fl_Widget *w, void *data)
 {
   CTX::instance()->hideUnselected = !CTX::instance()->hideUnselected;
@@ -467,45 +309,45 @@ static void class_hide_cb(Fl_Widget *w, void *data)
   drawContext::global()->draw();
 }
 
-static void buildListOfEdgeAngle(e2t_cont adj, std::vector<edge_angle> &edges_detected,
-                                 std::vector<edge_angle> &edges_lonly)
+static void show_only_edges_cb(Fl_Widget *w, void *data)
 {
-  e2t_cont::iterator it = adj.begin();
-  for(; it != adj.end(); ++it){
-    if(it->second.second)
-      edges_detected.push_back(edge_angle(it->first.getVertex(0), 
-                                          it->first.getVertex(1), 
-                                          it->second.first, it->second.second));
-    else 
-      edges_lonly.push_back(edge_angle(it->first.getVertex(0),
-                                       it->first.getVertex(1), 
-                                       it->second.first, it->second.second));
+  classificationEditor *e = (classificationEditor*)data;
+  static int old_sf = opt_mesh_surfaces_faces(0, GMSH_GET, 0.);
+  static int old_se = opt_mesh_surfaces_edges(0, GMSH_GET, 0.);
+  if(e->toggles[CLASS_TOGGLE_SHOW_ONLY_EDGES]->value()){
+    opt_mesh_lines(0, GMSH_SET | GMSH_GUI, 1.);
+    opt_mesh_surfaces_faces(0, GMSH_SET | GMSH_GUI, 0.);
+    opt_mesh_surfaces_edges(0, GMSH_SET | GMSH_GUI, 0.);
   }
-  std::sort(edges_detected.begin(), edges_detected.end());
+  else{
+    opt_mesh_surfaces_faces(0, GMSH_SET | GMSH_GUI, old_sf);
+    opt_mesh_surfaces_edges(0, GMSH_SET | GMSH_GUI, old_se);
+  }
+  drawContext::global()->draw();
 }
 
-static void class_select_cb(Fl_Widget *w, void *data)
+static void class_delete_edge_cb(Fl_Widget *w, void *data)
 {
   classificationEditor *e = (classificationEditor*)data;
-  std::vector<MTriangle*> &ele(e->getElements());
 
-  CTX::instance()->pickElements = 1;
+  if(!e->selected) return;
 
+  CTX::instance()->pickElements = 1;
+  std::vector<MLine*> ele;
+  
   while(1) {
     CTX::instance()->mesh.changed = ENT_ALL;
     drawContext::global()->draw();
 
-    Msg::StatusBar(3, false, "Select Elements\n"
+    Msg::StatusBar(3, false, "Select elements\n"
                    "[Press 'e' to end selection or 'q' to abort]");
     
     char ib = FlGui::instance()->selectEntity(ENT_ALL);
     if(ib == 'l') {
-      if(CTX::instance()->pickElements){
-        for(unsigned int i = 0; i < FlGui::instance()->selectedElements.size(); i++){
-          MElement *me = FlGui::instance()->selectedElements[i];
-          if(me->getType() == TYPE_TRI && me->getVisibility() != 2){
-            me->setVisibility(2); ele.push_back((MTriangle*)me);
-          }
+      for(unsigned int i = 0; i < FlGui::instance()->selectedElements.size(); i++){
+        MElement *me = FlGui::instance()->selectedElements[i];
+        if(me->getType() == TYPE_LIN && me->getVisibility() != 2){
+          me->setVisibility(2); ele.push_back((MLine*)me);
         }
       }
     }
@@ -516,10 +358,6 @@ static void class_select_cb(Fl_Widget *w, void *data)
     // ok, we compute edges !
     if(ib == 'e') {
       GModel::current()->setSelection(0);
-      e2t_cont adj;
-      buildEdgeToTriangle(ele, adj);
-      buildListOfEdgeAngle(adj, e->edges_detected, e->edges_lonly);
-      ElementsSelectedMode(e);
       break;
     }
     // do nothing
@@ -529,164 +367,366 @@ static void class_select_cb(Fl_Widget *w, void *data)
       break;
     }
   }
-  
-  updateedges_cb(0, data);
 
+  std::sort(ele.begin(), ele.end());
+
+  //  look in all selected edges if a deleted one is present and delete it
+  std::vector<MLine*> temp = e->selected->lines;
+  e->selected->lines.clear();
+  for(unsigned int i = 0; i < temp.size(); i++){      
+    std::vector<MLine*>::iterator it = std::find(ele.begin(), ele.end(), temp[i]);
+    if(it != ele.end()) 
+      delete temp[i];
+    else
+      e->selected->lines.push_back(temp[i]);
+  }
+  
   CTX::instance()->mesh.changed = ENT_ALL;
   CTX::instance()->pickElements = 0;
   drawContext::global()->draw();  
   Msg::StatusBar(3, false, "");
+
+  e->elements.clear();
+  e->edges_detected.clear();
 }
 
-edge_angle::edge_angle(MVertex *_v1, MVertex *_v2, MElement *t1, MElement *t2)
-  : v1(_v1), v2(_v2)
+static void class_reset_selection_cb(Fl_Widget *w, void *data)
 {
-  if(!t2) angle = 0;
-  else{
-    double c1[3];
-    double c2[3];
-    double c3[3];
-    {
-      MVertex *p1 = t1->getVertex(0);
-      MVertex *p2 = t1->getVertex(1);
-      MVertex *p3 = t1->getVertex(2);
-      double a[3] = {p1->x() - p2->x(), p1->y() - p2->y(), p1->z() - p2->z()};
-      double b[3] = {p1->x() - p3->x(), p1->y() - p3->y(), p1->z() - p3->z()};
-      c1[2] = a[0] * b[1] - a[1] * b[0];
-      c1[1] = -a[0] * b[2] + a[2] * b[0];
-      c1[0] = a[1] * b[2] - a[2] * b[1];
+  classificationEditor *e = (classificationEditor*)data;
+  if(!e->selected) return;
+  for(unsigned int i = 0; i < e->selected->lines.size(); i++)
+    delete e->selected->lines[i];
+  e->selected->lines.clear();
+  e->selected->deleteVertexArrays();
+  e->elements.clear();
+  e->edges_detected.clear();
+  NoElementsSelectedMode(e);
+}
+
+static void class_select_surfaces_cb(Fl_Widget *w, void *data)
+{
+  classificationEditor *e = (classificationEditor*)data;
+  std::vector<GFace*> temp;
+
+  opt_geometry_surfaces(0, GMSH_SET | GMSH_GUI, 1);
+
+  while(1) {
+    CTX::instance()->mesh.changed = ENT_ALL;
+    drawContext::global()->draw();
+
+    Msg::StatusBar(3, false, "Select Surface\n"
+                   "[Press 'e' to end selection or 'q' to abort]");
+    
+    char ib = FlGui::instance()->selectEntity(ENT_SURFACE);
+    if(ib == 'l') {
+      for(unsigned int i = 0; i < FlGui::instance()->selectedFaces.size(); i++){
+        FlGui::instance()->selectedFaces[i]->setSelection(1);
+        temp.push_back(FlGui::instance()->selectedFaces[i]);
+      }
     }
-    {
-      MVertex *p1 = t2->getVertex(0);
-      MVertex *p2 = t2->getVertex(1);
-      MVertex *p3 = t2->getVertex(2);
-      double a[3] = {p1->x() - p2->x(), p1->y() - p2->y(), p1->z() - p2->z()};
-      double b[3] = {p1->x() - p3->x(), p1->y() - p3->y(), p1->z() - p3->z()};
-      c2[2] = a[0] * b[1] - a[1] * b[0];
-      c2[1] = -a[0] * b[2] + a[2] * b[0];
-      c2[0] = a[1] * b[2] - a[2] * b[1];
+    if(ib == 'e') { // store the list of gfaces
+      GModel::current()->setSelection(0);
+      for(unsigned int i = 0; i < temp.size(); i++){
+        e->faces.insert(temp[i]);
+      }
+      break;
     }
-    norme(c1);
-    norme(c2);
-    prodve(c1, c2, c3);
-    double cosa; prosca(c1, c2, &cosa);
-    double sina = norme(c3);
-    angle = atan2(sina, cosa);
+    if(ib == 'q') { // do nothing
+      GModel::current()->setSelection(0);
+      break;
+    }
+  } 
+
+  if(e->faces.size())
+    e->buttons[CLASS_BUTTON_CLASSIFY]->activate();
+
+  CTX::instance()->mesh.changed = ENT_ALL;
+  drawContext::global()->draw();  
+  Msg::StatusBar(3, false, "");
+}
+
+static void class_select_all_surfaces_cb(Fl_Widget *w, void *data)
+{
+  classificationEditor *e = (classificationEditor*)data;
+
+  for(GModel::fiter it = GModel::current()->firstFace(); 
+      it != GModel::current()->lastFace(); ++it)
+    e->faces.insert(*it);
+
+  if(e->faces.size())
+    e->buttons[CLASS_BUTTON_CLASSIFY]->activate();
+
+  CTX::instance()->mesh.changed = ENT_ALL;
+  drawContext::global()->draw();  
+  Msg::StatusBar(3, false, "");
+}
+
+static void class_classify_cb(Fl_Widget *w, void *data)
+{
+  classificationEditor *e = (classificationEditor*)data;
+  std::map<MLine*, GEdge*, compareMLinePtr> lines;
+  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()->maxFaceNum() + 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;
+  recurClassifyEdges(*it, reverse, lines, touched, 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){
+    GEdge *ge = it->second;
+    std::list<MLine*> segments;
+    for (unsigned int i = 0; i < ge->lines.size(); i++){
+      segments.push_back(ge->lines[i]);
+    }
+    
+    // for each actual GEdge
+    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++;
+      // printf("***candidate mline %d %d of size %d \n", 
+      //        vB->getNum(), vE->getNum(), segments.size());
+      
+      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);
+          // printf("mline %d %d \n", v1->getNum(), v2->getNum());
+          std::list<MLine*>::iterator itp;
+          if (v1 == vE){
+            // printf("->push back this mline \n");
+            myLines.push_back(*it);
+            itp = it;
+            it++;
+            segments.erase(itp);
+            vE = v2;
+            i = -1;
+          }
+          else if ( v2 == vE){
+            //printf("->push back this mline \n");
+            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;
+        // printf("not found VB=%d vE=%d\n", vB->getNum(), vE->getNum());
+        MVertex *temp = vB;
+        vB = vE;
+        vE = temp;
+        // printf("not found VB=%d vE=%d\n", vB->getNum(), vE->getNum());
+      }
+      GEdge *newGe = new discreteEdge
+        (GModel::current(), GModel::current()->maxEdgeNum() + 1, 0, 0);
+      newGe->lines.insert(newGe->lines.end(), myLines.begin(), myLines.end());
+      GModel::current()->add(newGe);
+    } //end for each actual GEdge
+  }
+
+  //printf("end new edge with tag \n");
+  
+  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
+  if(e->selected){
+    GModel::current()->remove(e->selected);
+    e->selected->lines.clear();
+    delete e->selected;
+    e->selected = 0;
+  }
+  e->elements.clear();
+  e->edges_detected.clear();
+  NoElementsSelectedMode(e);
 }
 
-classificationEditor::classificationEditor()
+classificationEditor::classificationEditor() : selected(0)
 {
-  op[0] = opt_mesh_lines(0, GMSH_GET, 0.);
-  op[1] = opt_mesh_surfaces_edges(0, GMSH_GET, 0.);
-  op[2] = opt_mesh_surfaces_faces(0, GMSH_GET, 0.);
-  op[3] = opt_mesh_line_width(0, GMSH_SET | GMSH_GET,0.);
-
-  opt_mesh_lines(0, GMSH_SET | GMSH_GUI, 1);
-  opt_mesh_surfaces_edges(0, GMSH_SET | GMSH_GUI, 0);
-  opt_mesh_surfaces_faces(0, GMSH_SET | GMSH_GUI, 1);
-  opt_mesh_line_width(0, GMSH_SET | GMSH_GUI, 1.5);
-
-  // construct GUI in terms of standard sizes
-  int BBB = (int)(1.4 * BB); // labels too long
-  const int width = (int)(3.5 * BBB), height = 10 * BH;
-
-  _window = new paletteWindow
-    (width, height, CTX::instance()->nonModalWindows ? true : false, "Classify");
+  opt_mesh_lines(0, GMSH_SET | GMSH_GUI, 1.);
+
+  drawContext::global()->draw();
+
+  int BBB = (int)(1.4 * BB);
+  const int width = (int)(3.15 * BBB), height = (int)(9.5 * BH);
+
+  window = new paletteWindow
+    (width, height, CTX::instance()->nonModalWindows ? true : false, "Reclassify");
+  window->box(GMSH_WINDOW_BOX);
   
-  new Fl_Tabs(WB, WB, width - 2 * WB, height - 2 * WB);
+  int x = WB, y = WB;
   {
-    Fl_Group *o = new Fl_Group
-      (WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Edge Detection");
-    edge_detec = o;
+    Fl_Box *b = new Fl_Box
+      (x, y, width, BH, "1. Select mesh elements on which to perform edge detection");
+    b->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);
     
-    _buttons[CLASSBUTTON_OK] = new Fl_Button 
-      (4*WB+2*BBB, 7*WB+6*BH, BBB, BH, "OK");
-    _buttons[CLASSBUTTON_OK]->callback(class_ok_cb, this);
+    x += WB;
+    y += BH;
+    buttons[CLASS_BUTTON_SELECT_ELEMENTS] = new Fl_Button
+      (x, y, BBB, BH, "Select elements");
+    buttons[CLASS_BUTTON_SELECT_ELEMENTS]->callback(class_select_elements_cb, this);
+
+    buttons[CLASS_BUTTON_SELECT_ALL_ELEMENTS] = new Fl_Button
+      (x + BBB + WB, y, (int)(0.5 * BBB) - WB, BH, "All");
+    buttons[CLASS_BUTTON_SELECT_ALL_ELEMENTS]->callback(class_select_all_elements_cb, this);
     
-    _buttons[CLASSBUTTON_SELECT] = new Fl_Button 
-      (2*WB, 2*WB+1*BH, BBB, BH, "Select Elements");
-    _buttons[CLASSBUTTON_SELECT]->callback(class_select_cb, this);
+    toggles[CLASS_TOGGLE_HIDE] = new Fl_Check_Button
+      (x + 1.5 * BBB + WB, y, width - 1.5 * BBB - x - 2 * WB, BH, "Hide unselected elements");
+    toggles[CLASS_TOGGLE_HIDE]->type(FL_TOGGLE_BUTTON);
+    toggles[CLASS_TOGGLE_HIDE]->callback(class_hide_cb, this);
     
-    _togbuttons[CLASSTOGBUTTON_HIDE] = new Fl_Toggle_Button
-      (3*WB+BBB, 2*WB+1*BH, BBB, BH, "Hide Unselected");
-    _togbuttons[CLASSTOGBUTTON_HIDE]->callback(class_hide_cb,this);
-
-    _togbuttons[CLASSTOGBUTTON_CLOS] = new Fl_Toggle_Button
-      (2*WB, 4*WB+3*BH, BBB, BH, "Include Closure");
-    _togbuttons[CLASSTOGBUTTON_CLOS]->callback(updateedges_cb,this);
+    x -= WB;
+  }
+  {
+    y += BH / 2;
+    Fl_Box* b = new Fl_Box(x, y + BH - WB, width - 2 * WB, 2);
+    b->box(FL_ENGRAVED_FRAME);
+    b->labeltype(FL_NO_LABEL);
+  }
+  {
+    y += BH;
+    Fl_Box *b = new Fl_Box
+      (x, y, width, BH, "2. Fine-tune edge selection");
+    b->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);
     
-    _inputs[CLASSVALUE_ANGLE] = new Fl_Value_Input
-      (3*WB+BBB, 4*WB+3*BH, BBB, BH, "Treshold Angle");
-    _inputs[CLASSVALUE_ANGLE]->value(40);
-    _inputs [CLASSVALUE_ANGLE]->maximum(90);
-    _inputs[CLASSVALUE_ANGLE]->minimum(0);
-    _inputs[CLASSVALUE_ANGLE]->align(FL_ALIGN_RIGHT);
-    _inputs[CLASSVALUE_ANGLE]->step(1);
-    _inputs[CLASSVALUE_ANGLE]->when(FL_WHEN_RELEASE);  
-    _inputs[CLASSVALUE_ANGLE]->callback(updateedges_cb,this);
-
-    _buttons[CLASSBUTTON_DEL] = new Fl_Button 
-      (2*WB, 5*WB+4*BH, BBB, BH, "Delete Edge");
-    _buttons[CLASSBUTTON_DEL]->callback(class_deleteedge_cb, this);    
-    _buttons[CLASSBUTTON_DEL]->deactivate();
-
-    _buttons[CLASSBUTTON_ADD] = new Fl_Button
-      (2*WB, 6*WB+5*BH, BBB, BH, "Save Selection");
-    _buttons[CLASSBUTTON_ADD]->callback(class_save_cb, this);    
-    _buttons[CLASSBUTTON_ADD]->deactivate();
-
-    _buttons[CLASSBUTTON_CLEAR] = new Fl_Button 
-      (2*WB, 7*WB+6*BH, BBB, BH, "Clear Selection");
-    _buttons[CLASSBUTTON_CLEAR]->callback(class_clear_cb, this);    
-    _buttons[CLASSBUTTON_CLEAR]->deactivate();
-    o->end();
+    x += WB;
+    y += BH;
+    inputs[CLASS_VALUE_ANGLE] = new Fl_Value_Input
+      (x, y, 2 * BBB / 3, BH, "Threshold angle");
+    inputs[CLASS_VALUE_ANGLE]->value(40);
+    inputs[CLASS_VALUE_ANGLE]->maximum(180);
+    inputs[CLASS_VALUE_ANGLE]->minimum(0);
+    inputs[CLASS_VALUE_ANGLE]->align(FL_ALIGN_RIGHT);
+    inputs[CLASS_VALUE_ANGLE]->step(1);
+    inputs[CLASS_VALUE_ANGLE]->when(FL_WHEN_RELEASE);  
+    inputs[CLASS_VALUE_ANGLE]->callback(update_edges_cb, this);
+
+    toggles[CLASS_TOGGLE_SHOW_ONLY_EDGES] = new Fl_Check_Button
+      (x + 1.5 * BBB + WB, y, width - x - 1.5 * BBB - 2 * WB, BH, "Show only edges");
+    toggles[CLASS_TOGGLE_SHOW_ONLY_EDGES]->type(FL_TOGGLE_BUTTON);
+    toggles[CLASS_TOGGLE_SHOW_ONLY_EDGES]->callback(show_only_edges_cb, this);
+    
+    y += BH;
+    toggles[CLASS_TOGGLE_BOUNDARY] = new Fl_Check_Button
+      (x, y, width - x - 2 * WB, BH, "Include edges on boundary (closure)");
+    toggles[CLASS_TOGGLE_BOUNDARY]->type(FL_TOGGLE_BUTTON);
+    toggles[CLASS_TOGGLE_BOUNDARY]->callback(update_edges_cb, this);
+    
+    y += BH;
+    buttons[CLASS_BUTTON_DELETE_FROM_SELECTION] = new Fl_Button 
+      (x, y, 1.5 * BBB, BH, "Delete edges from selection");
+    buttons[CLASS_BUTTON_DELETE_FROM_SELECTION]->callback(class_delete_edge_cb, this);    
+    buttons[CLASS_BUTTON_DELETE_FROM_SELECTION]->deactivate();
+    
+    buttons[CLASS_BUTTON_RESET_SELECTION] = new Fl_Button 
+      (x + 1.5 * BBB + WB, y, BBB, BH, "Reset selection");
+    buttons[CLASS_BUTTON_RESET_SELECTION]->callback(class_reset_selection_cb, this);    
+    buttons[CLASS_BUTTON_RESET_SELECTION]->deactivate();
+    
+    x -= WB;
   }
   {
-    Fl_Group *o = new Fl_Group
-      (WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Face Colouring");
-    face_color = o;
-    o->deactivate();
-    o->hide();
-    _buttons[CLASSBUTTON_SELFAC] = new Fl_Button
-      (2*WB, 2*WB+1*BH, BBB, BH, "Select Model Face");
-    _buttons[CLASSBUTTON_SELFAC]->callback(class_selectgface_cb, this);
-    _buttons[CLASSBUTTON_COLOR] = new Fl_Button 
-      (2*WB, 3*WB+2*BH, BBB, BH, "Classify Mesh Faces");
-    _buttons[CLASSBUTTON_COLOR]->callback(class_color_cb, this);
-    o->end();
+    y += BH / 2;
+    Fl_Box* b = new Fl_Box(x, y + BH - WB, width - 2 * WB, 2);
+    b->box(FL_ENGRAVED_FRAME);
+    b->labeltype(FL_NO_LABEL);
   }
   {
-    Fl_Group *o = new Fl_Group
-      (WB, WB + BH, width - 2 * WB, height - 2 * WB - BH, "Reparametrize Surfaces");
-    reverse_eng = o;
-    o->hide();
-    o->deactivate();
-    o->end();
+    y += BH;
+    Fl_Box *b = new Fl_Box
+      (x, y, width, BH, "3. Reclassify surfaces using selected edges");
+    b->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);
+    
+    x += WB;
+    y += BH;
+
+    buttons[CLASS_BUTTON_SELECT_SURFACES] = new Fl_Button
+      (x, y, BBB, BH, "Select surfaces");
+    buttons[CLASS_BUTTON_SELECT_SURFACES]->callback(class_select_surfaces_cb, this);
+
+    buttons[CLASS_BUTTON_SELECT_ALL_SURFACES] = new Fl_Button
+      (x + BBB + WB, y, (int)(0.5 * BBB) - WB, BH, "All");
+    buttons[CLASS_BUTTON_SELECT_ALL_SURFACES]->callback(class_select_all_surfaces_cb, this);
+
+    buttons[CLASS_BUTTON_CLASSIFY] = new Fl_Button 
+      (x + 1.5 * BBB + WB, y, BBB, BH, "Reclassify");
+    buttons[CLASS_BUTTON_CLASSIFY]->callback(class_classify_cb, this);
+    buttons[CLASS_BUTTON_CLASSIFY]->deactivate();
+
+    x -= WB;
   }
-  NoElementsSelectedMode(this);
 
-  // allocate detected edges
-  // temporary for the selection
-  // saved for the ones that have been saved by the user
-  // and that will be used for next step
+  window->end();
+  window->hotspot(window);
 
-  temporary = new discreteEdge(GModel::current(), GModel::current()->maxEdgeNum() + 1, 0, 0);
-  GModel::current()->add(temporary);
-  saved = new discreteEdge(GModel::current(), GModel::current()->maxEdgeNum() + 1, 0, 0);
-  GModel::current()->add(saved);
-  
-  _window->end();
-  _window->hotspot(_window);
-  _window->size_range(width, (int)(0.85 * height));    
+  NoElementsSelectedMode(this);
 }
 
 void mesh_classify_cb(Fl_Widget* w, void* data)
 {
   // create the (static) editor
   static classificationEditor *editor = 0;
-  if(!editor){
-    editor = new classificationEditor();
-  }
+  if(!editor) editor = new classificationEditor();
   editor->show();
 }
diff --git a/Fltk/classificationEditor.h b/Fltk/classificationEditor.h
index 55ba72a2db..4bd2b2711b 100644
--- a/Fltk/classificationEditor.h
+++ b/Fltk/classificationEditor.h
@@ -7,24 +7,26 @@
 #define _CLASSIFICATION_EDITOR_H_
 
 #include <vector>
-#include <FL/Fl_Toggle_Button.H>
-#include <FL/Fl_Round_Button.H>
 #include <FL/Fl_Window.H>
+#include <FL/Fl_Check_Button.H>
 #include <FL/Fl_Value_Input.H>
 #include "GModel.h"
 #include "MElement.h"
 #include "ColorTable.h"
 
-#define CLASSBUTTON_SELECT   0
-#define CLASSBUTTON_DEL      1
-#define CLASSBUTTON_ADD      2
-#define CLASSBUTTON_CLEAR    3
-#define CLASSBUTTON_OK       4
-#define CLASSBUTTON_COLOR    5
-#define CLASSBUTTON_SELFAC   6
-#define CLASSTOGBUTTON_HIDE  0
-#define CLASSTOGBUTTON_CLOS  1
-#define CLASSVALUE_ANGLE     0
+#define CLASS_BUTTON_SELECT_ELEMENTS       0
+#define CLASS_BUTTON_SELECT_ALL_ELEMENTS   1
+#define CLASS_BUTTON_DELETE_FROM_SELECTION 2
+#define CLASS_BUTTON_RESET_SELECTION       3
+#define CLASS_BUTTON_SELECT_SURFACES       4
+#define CLASS_BUTTON_SELECT_ALL_SURFACES   5
+#define CLASS_BUTTON_CLASSIFY              6
+
+#define CLASS_TOGGLE_HIDE             0
+#define CLASS_TOGGLE_BOUNDARY         1
+#define CLASS_TOGGLE_SHOW_ONLY_EDGES  2
+
+#define CLASS_VALUE_ANGLE             0
 
 class edge_angle {
  public :
@@ -40,21 +42,16 @@ class edge_angle {
 class classificationEditor {
  public:
   double op[10];
-  std::vector<MTriangle*> _elements;
-  std::set<GFace*> _faces;
-  Fl_Window *_window;
-  Fl_Button *_buttons[10];
-  Fl_Toggle_Button *_togbuttons[10];
-  Fl_Value_Input *_inputs[10];
-  GEdge *temporary;
-  GEdge *saved;
-  std::list<GFace *> tempFaces;
-  std::vector<edge_angle> edges_detected;
-  std::vector<edge_angle> edges_lonly;
+  std::vector<MTriangle*> elements;
+  std::set<GFace*> faces;
+  Fl_Window *window;
+  Fl_Button *buttons[10];
+  Fl_Check_Button *toggles[10];
+  Fl_Value_Input *inputs[10];
+  GEdge *selected, *saved;
+  std::vector<edge_angle> edges_detected, edges_lonly;
   classificationEditor();
-  void show(){ _window->show(); }
-  std::vector<MTriangle*> &getElements() { return _elements; }
-  Fl_Group *edge_detec, *face_color, *reverse_eng;
+  void show(){ window->show(); }
 };
 
 void mesh_classify_cb(Fl_Widget* w, void* data);
diff --git a/benchmarks/extrude/sphere_boundary_layer.geo b/benchmarks/extrude/sphere_boundary_layer.geo
index dc79a3ccac..e8498a641f 100644
--- a/benchmarks/extrude/sphere_boundary_layer.geo
+++ b/benchmarks/extrude/sphere_boundary_layer.geo
@@ -1,4 +1,4 @@
-lc = .2;
+lc = 1;
 
 Point(1) = {0.0,0.0,0.0,lc};
 Point(2) = {1,0.0,0.0,lc};
@@ -37,9 +37,12 @@ Ruled Surface(26) = {25};
 Line Loop(27) = {-4,12,-6};
 Ruled Surface(28) = {27};
 
-Extrude {
-  Surface{14:28:2};  Layers{10, 0.2}; // Recombine; 
-}
+old = Geometry.ExtrudeReturnLateralEntities;
+Geometry.ExtrudeReturnLateralEntities = 0;
+tmp[] = Extrude {
+  Surface{14:28:2}; Layers{5, 0.2}; Recombine; // 14:28:2 means itterate from 14 to 28 by steps of 2
+};
+Geometry.ExtrudeReturnLateralEntities = old;
 
 Point(100) = {-1.5,-1.5,-1.5, lc};
 Point(101) = {-1.5,1.5,-1.5, lc};
@@ -74,10 +77,11 @@ Plane Surface(186) = {185};
 Line Loop(187) = {172, 173, 174, 167};
 Plane Surface(188) = {187};
 
-Surface Loop(1000) = {20, 22, 18, 14, 26, 16, 24, 28};
-Surface Loop(1001) = {45, 96, 113, 79, 62, 130, 147, 164};
-Surface Loop(1002) = {188, 186, 184, 180, 178, 182};
-Volume(1000) = {1000}; // inside
-Volume(1001) = {1002, 1001}; // outside
+Surface Loop(1000) = {14:28:2}; // the sphere (only need for internal mesh)
+Surface Loop(1001) = {tmp[{0:14:2}]};  // The outside of the BL
+Surface Loop(1002) = {188, 186, 184, 180, 178, 182}; // the box (entire farfield surface loop)
+
+//Volume(1000) = {1000}; /// inside the sphere
+Volume(1001) = {1002, 1001}; /// FarField
 
 Mesh.Algorithm3D = 4;
diff --git a/benchmarks/stl/coupe_geom.stl.gz b/benchmarks/stl/coupe_geom.stl.gz
index ae299fdde2d37645c8dce300fd4075242009c319..ec014157e439ba7cfe120432d23cb73a5be82e26 100644
GIT binary patch
literal 21752
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
PKl5y^QwCe^Gcf=F`9<HO

literal 23495
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
T9Yr4=|Cbkbbvl0j4HE+Zht-fn

-- 
GitLab