From 0a57d4f1de0a28e87860a9753e1a2cc18fd40ca5 Mon Sep 17 00:00:00 2001
From: Amaury Johnan <amjohnen@gmail.com>
Date: Thu, 8 Mar 2012 19:12:32 +0000
Subject: [PATCH] draw solution of recombine(depth)

---
 Mesh/meshGFaceRecombine.cpp | 70 ++++++++++++++++++++++++++++++++++---
 Mesh/meshGFaceRecombine.h   | 14 +++++++-
 2 files changed, 79 insertions(+), 5 deletions(-)

diff --git a/Mesh/meshGFaceRecombine.cpp b/Mesh/meshGFaceRecombine.cpp
index c3831f4b2e..2fef7100fe 100644
--- a/Mesh/meshGFaceRecombine.cpp
+++ b/Mesh/meshGFaceRecombine.cpp
@@ -217,7 +217,7 @@ bool Recombine2D::recombine()
     FlGui::instance()->check();
     double time = Cpu();
     nextAction->color(0, 0, 200);
-    CTX::instance()->mesh.changed = (ENT_ALL);
+    CTX::instance()->mesh.changed = ENT_ALL;
     drawContext::global()->draw();
 #endif
     
@@ -239,7 +239,7 @@ bool Recombine2D::recombine()
 #ifdef REC2D_DRAW
     _gf->triangles = _data->_tri;
     _gf->quadrangles = _data->_quad;
-    CTX::instance()->mesh.changed = (ENT_ALL);
+    CTX::instance()->mesh.changed = ENT_ALL;
     drawContext::global()->draw();
     while (Cpu()-time < REC2D_WAIT_TIME)
       FlGui::instance()->check();
@@ -252,13 +252,14 @@ bool Recombine2D::recombine()
 #ifdef REC2D_SMOOTH
     laplaceSmoothing(_gf,100);
 #endif
-    CTX::instance()->mesh.changed = (ENT_ALL);
+    CTX::instance()->mesh.changed = ENT_ALL;
     drawContext::global()->draw();
   return 1;
 }
 
 bool Recombine2D::recombine(int depth)
 {
+  Rec2DData::clearChanges(); 
   double bestGlobalQuality;
   Rec2DNode *root = new Rec2DNode(NULL, NULL, bestGlobalQuality, depth);
   Rec2DNode *currentNode = root->selectBestNode();
@@ -316,6 +317,14 @@ void Recombine2D::nextTreeActions(std::vector<Rec2DAction*> &actions,
   rel->getActions(actions);
 }
 
+void Recombine2D::drawState(double shiftx, double shifty)
+{
+  _data->drawTriangles(shiftx, shifty);
+  _data->drawChanges(shiftx, shifty);
+  CTX::instance()->mesh.changed = ENT_ALL;
+  drawContext::global()->draw();
+}
+
 double Recombine2D::_geomAngle(MVertex *v,
                                std::vector<GEdge*> &gEdge,
                                std::vector<MElement*> &elem) //*
@@ -689,6 +698,15 @@ bool Rec2DData::revertDataChange(Rec2DDataChange *rdc)
   return true;
 }
 
+void Rec2DData::clearChanges()
+{
+  for (int i = (int) _current->_changes.size() - 1; i > -1; --i) {
+    _current->_changes[i]->revert();
+    delete _current->_changes[i];
+  }
+  _current->_changes.clear();
+}
+
 void Rec2DData::removeParity(Rec2DVertex *rv, int p)
 {
   std::map<int, std::vector<Rec2DVertex*> >::iterator it;
@@ -894,6 +912,25 @@ Rec2DAction* Rec2DData::getBestAction()
   return *std::max_element(_current->_actions.begin(),
                            _current->_actions.end(), lessRec2DAction());
 }
+void Rec2DData::drawTriangles(double shiftx, double shifty)
+{
+  iter_rel it = firstElement();
+  for (; it != lastElement(); ++it) {
+    if ((*it)->isTri())
+      (*it)->createElement(shiftx, shifty);
+  }
+}
+
+void Rec2DData::drawChanges(double shiftx, double shifty)
+{
+  std::map<int, std::vector<double> > data;
+  int k = 0;
+  for (unsigned int i = 0; i < _changes.size(); ++i) {
+    data[_changes[i]->getAction()->getNum(shiftx, shifty)].push_back(++k);
+  }
+  new PView("Changes", "ElementData", Recombine2D::getGFace()->model(), data);
+}
+
 void Rec2DData::drawEndNode(int num)
 {
   double dx = .0, dy = .0;
@@ -1157,7 +1194,8 @@ void Rec2DTwoTri2Quad::apply(std::vector<Rec2DVertex*> &newPar)
 }
 
 void Rec2DTwoTri2Quad::apply(Rec2DDataChange *rdc)
-{  
+{
+  rdc->setAction(this);
   std::vector<Rec2DAction*> actions;
   _triangles[0]->getUniqueActions(actions);
   _triangles[1]->getUniqueActions(actions);
@@ -2147,6 +2185,30 @@ Rec2DVertex* Rec2DElement::getOtherVertex(Rec2DVertex *rv1, Rec2DVertex *rv2) co
   return NULL;
 }
 
+void Rec2DElement::createElement(double shiftx, double shifty) const
+{
+  if (_numEdge != 3) {
+    Msg::Error("[Rec2DElement] Need definition");
+  }
+  static int a = 0;
+  
+  std::vector<Rec2DVertex*> v;
+  getVertices(v);
+  
+  MVertex *v0 = new MVertex(v[0]->getMVertex()->x() + shiftx,
+                            v[0]->getMVertex()->y() + shifty,
+                            v[0]->getMVertex()->z()          );
+  MVertex *v1 = new MVertex(v[1]->getMVertex()->x() + shiftx,
+                            v[1]->getMVertex()->y() + shifty,
+                            v[1]->getMVertex()->z()          );
+  MVertex *v2 = new MVertex(v[2]->getMVertex()->x() + shiftx,
+                            v[2]->getMVertex()->y() + shifty,
+                            v[2]->getMVertex()->z()          );
+  
+  MTriangle *tri = new MTriangle(v0, v1, v2);
+  Recombine2D::add(tri);
+}
+
 MQuadrangle* Rec2DElement::_createQuad() const
 {
   if (_numEdge != 4) {
diff --git a/Mesh/meshGFaceRecombine.h b/Mesh/meshGFaceRecombine.h
index 103e1dadce..46f5eb8102 100644
--- a/Mesh/meshGFaceRecombine.h
+++ b/Mesh/meshGFaceRecombine.h
@@ -67,12 +67,14 @@ class Recombine2D {
                                 std::vector<Rec2DElement*> &neighbours);
     
     inline void setStrategy(int s) {_strategy = s;}
+    void drawState(double shiftx, double shifty);
     
     static inline GFace* getGFace() {return _current->_gf;}
     static inline int getNumChange() {return _current->_numChange;}
     static inline void incNumChange() {++_current->_numChange;}
     static inline backgroundMesh* bgm() {return _current->_bgm;}
     static void add(MQuadrangle *q) {_current->_gf->quadrangles.push_back(q);}
+    static void add(MTriangle *t) {_current->_gf->triangles.push_back(t);}
     
   private :
     double _geomAngle(MVertex*,
@@ -105,6 +107,8 @@ class Rec2DData {
     ~Rec2DData();
     
     void printState();
+    void drawTriangles(double shiftx, double shifty);
+    void drawChanges(double shiftx, double shifty);
 #ifdef REC2D_DRAW
     std::vector<MTriangle*> _tri;
     std::vector<MQuadrangle*> _quad;
@@ -116,6 +120,8 @@ class Rec2DData {
     static inline int getNumElement() {return _current->_elements.size();}
     static Rec2DDataChange* getNewDataChange();
     static bool revertDataChange(Rec2DDataChange*);
+    static void clearChanges();
+    static int getNumChanges() {return _current->_changes.size();}
     
     static double getGlobalQuality();
     static double getGlobalQuality(int numEdge, double valEdge,
@@ -193,6 +199,8 @@ class Rec2DDataChange {
     std::vector<Rec2DAction*> _hiddenAction, _newAction;
     std::vector<std::pair<Rec2DVertex*, SPoint2> > _oldCoordinate;
     
+    Rec2DAction *_ra;
+    
   public :
     void hide(Rec2DEdge*);
     void hide(Rec2DElement*);
@@ -201,6 +209,9 @@ class Rec2DDataChange {
     void append(Rec2DElement*);
     
     void revert();
+    
+    void setAction(Rec2DAction *action) {_ra = action;}
+    Rec2DAction* getAction() {return _ra;}
 };
 
 class Rec2DAction {
@@ -389,7 +400,7 @@ class Rec2DElement {
   public :
     Rec2DElement(MTriangle*, Rec2DEdge**, Rec2DVertex **rv = NULL);
     Rec2DElement(MQuadrangle*, Rec2DEdge**, Rec2DVertex **rv = NULL);
-    ~Rec2DElement() {hide();}
+    ~Rec2DElement() { hide();}
     void hide();
     void reveal();
     
@@ -423,6 +434,7 @@ class Rec2DElement {
       return NULL;
     }
 #endif
+    void createElement(double shiftx, double shifty) const;
     
     double getAngle(Rec2DVertex*);
     
-- 
GitLab