diff --git a/Mesh/meshGFaceRecombine.cpp b/Mesh/meshGFaceRecombine.cpp index 3053925684b401593732ed3c14895e4af502d288..fe59839db9b94afb428ad2d4bf07ce7bc1c8e828 100644 --- a/Mesh/meshGFaceRecombine.cpp +++ b/Mesh/meshGFaceRecombine.cpp @@ -225,7 +225,7 @@ bool Recombine2D::recombine() drawContext::global()->draw(); #endif - if (!_remainAllQuad(nextAction)) { + if (false) { // if !(remain all quad) delete nextAction; #ifdef REC2D_DRAW nextAction->color(190, 0, 0); @@ -486,144 +486,6 @@ double Recombine2D::_geomAngle(const MVertex *v, return angle2; } -bool Recombine2D::_remainAllQuad(const Rec2DAction *action) const -{ - if (action->isAssumedObsolete()) { - static int a = -1; - if (++a < 1) - Msg::Error("[Recombine2D] obsolete action (allQuad)"); - return false; - } - Rec2DData::clearAssumedParities(); - - int p[4]; - action->getAssumedParities(p); - - if (!p[0] && !p[1] && !p[2] && !p[3]) { - static int a = -1; - if (++a < 1) Msg::Warning("FIXME isoleted should be check ? Think not"); - return true; - } - - int min = Rec2DData::getNewParity(), index = -1; - for (int i = 0; i < 4; ++i) { - if (p[i] && min > p[i]) { - min = p[i]; - index = i; - } - } - if (index == -1) { - Msg::Error("[Recombine2D] Please, fixme !"); - return false; - } - - std::set<Rec2DElement*> neighbours; - std::vector<Rec2DVertex*> touched; - - for (int i = 0; i < 4; i += 2) { - static int a = -1; - if (++a < 1) Msg::Warning("FIXME depend de l'action"); - int par; - if ((index/2) * 2 == i) - par = min; - else - par = otherParity(min); - for (int j = 0; j < 2; ++j) { - if (!p[i+j]) { - Rec2DVertex *v = action->getVertex(i+j); - v->setAssumedParity(par); - v->getTriangles(neighbours); - } - else if (p[i+j] != par) - Rec2DData::associateAssumedParity(p[i+j], par, touched); - } - } - - for (unsigned int i = 0; i < touched.size(); ++i) - touched[i]->getTriangles(neighbours); - touched.clear(); - - return _remainAllQuad(neighbours); -} - -bool Recombine2D::_remainAllQuad(std::set<Rec2DElement*> &elem) const -{ - std::vector<Rec2DVertex*> touched; - - while (elem.size() > 0) { - std::set<Rec2DElement*>::iterator itTri = elem.begin(); - - int p[3]; - (*itTri)->getAssumedParities(p); - - bool hasIdentical = false; - for (int i = 0; i < 3; ++i) { - if (p[i] && p[i] == p[(i+1)%3]) hasIdentical = true; - } - if (!hasIdentical) { - elem.erase(itTri); - continue; - } - if (p[0] == p[1] && p[0] == p[2]) { - Rec2DData::revertAssumedParities(); - return false; - } - - bool hasAction = false; - std::map<Rec2DVertex*, std::vector<int> > suggestions; - for (int i = 0; i < (*itTri)->getNumActions(); ++i) { - if ((*itTri)->getAction(i)->whatWouldYouDo(suggestions)) - hasAction = true; - } - if (!hasAction) { - Rec2DData::revertAssumedParities(); - return false; - } - - std::map<Rec2DVertex*, std::vector<int> >::iterator itSug; - itSug = suggestions.begin(); - for (; itSug != suggestions.end(); ++itSug) { - int par = itSug->second.front(); - bool onlyOnePar = true; - for (unsigned int i = 1; i < itSug->second.size(); ++i) { - if (itSug->second[i] != par) { - onlyOnePar = false; - break; - } - } - - if (onlyOnePar) { - Rec2DVertex *v = itSug->first; - int oldPar = v->getAssumedParity(); - - if (!oldPar) { - v->setAssumedParity(par); - v->getTriangles(elem); - } - else if ((par/2)*2 != (oldPar/2)*2) { - if (oldPar < par) { - int a = oldPar; - oldPar = par; - par = a; - } - Rec2DData::associateAssumedParity(oldPar, par, touched); - for (unsigned int i = 0; i < touched.size(); ++i) { - touched[i]->getTriangles(elem); - } - touched.clear(); - } - else if (par%2 != oldPar%2) { - Msg::Error("SHOULD NOT HAPPEN"); - Rec2DData::revertAssumedParities(); - return false; - } - } - } - elem.erase(itTri); - } - return true; -} - void Recombine2D::add(MQuadrangle *q) { _current->_gf->quadrangles.push_back(q); @@ -946,118 +808,6 @@ void Rec2DData::associateParity(int pOld, int pNew, Rec2DDataChange *rdc) } } -void Rec2DData::removeAssumedParity(const Rec2DVertex *rv, int p) -{ - std::map<int, std::vector<Rec2DVertex*> >::iterator it; - it = _current->_assumedParities.find(p); - if (it == _current->_assumedParities.end()) { - Msg::Error("[Rec2DData] Don't have assumed parity %d", p); - return; - } - bool b = false; - std::vector<Rec2DVertex*> *vect = &it->second; - unsigned int i = 0; - while (i < vect->size()) { - if (vect->at(i) == rv) { - vect->at(i) = vect->back(); - vect->pop_back(); - if (b) - Msg::Error("[Rec2DData] Two or more times same vertex"); - b = true; - } - else - ++i; - } - if (!b) - Msg::Error("[Rec2DData] No vertex 2"); -} - -void Rec2DData::saveAssumedParity(const Rec2DVertex *rv, int p) -{ - static int a = -1; - if (++a < 1) - Msg::Warning("FIXME Do you have cleared _oldParity ?"); - std::map<Rec2DVertex*, int>::iterator it = - _current->_oldParity.find((Rec2DVertex*)rv); - if (it == _current->_oldParity.end()) - _current->_oldParity[(Rec2DVertex*)rv] = p; -} - -void Rec2DData::associateAssumedParity(int pOld, int pNew, - std::vector<Rec2DVertex*> &touched) -{ - if (pOld/2 == pNew/2) { - Msg::Error("[Rec2DData] Do you want to make a mess of assumed parities ?"); - return; - } - if (_current->_assumedParities.find(pNew) == _current->_assumedParities.end()) { - Msg::Warning("[Rec2DData] That's strange, isn't it ?"); - } - std::map<int, std::vector<Rec2DVertex*> >::iterator it; - std::vector<Rec2DVertex*> *vect, *vectNew; - - { - it = _current->_parities.find(pOld); - if (it == _current->_parities.end()) { - Msg::Error("[Rec2DData] But, this parity doesn't exist !"); - return; - } - vect = &it->second; - for (unsigned int i = 0; i < vect->size(); ++i) { - if (vect->at(i)->setAssumedParity(pNew)) - touched.push_back(vect->at(i)); - } - - it = _current->_assumedParities.find(pOld); - if (it != _current->_assumedParities.end()) { - vect = &it->second; - for (unsigned int i = 0; i < vect->size(); ++i) { - vect->at(i)->setAssumedParityWD(pOld, pNew); - touched.push_back(vect->at(i)); - } - vectNew = &_current->_assumedParities[pNew]; - vectNew->insert(vectNew->end(), vect->begin(), vect->end()); - _current->_assumedParities.erase(it); - } - } - - pOld = otherParity(pOld); - pNew = otherParity(pNew); - { - it = _current->_parities.find(pOld); - if (it == _current->_parities.end()) { - Msg::Error("[Rec2DData] What ?"); - return; - } - vect = &it->second; - for (unsigned int i = 0; i < vect->size(); ++i) { - if (vect->at(i)->setAssumedParity(pNew)) - touched.push_back(vect->at(i)); - } - - it = _current->_assumedParities.find(pOld); - if (it != _current->_assumedParities.end()) { - vect = &it->second; - for (unsigned int i = 0; i < vect->size(); ++i) { - vect->at(i)->setAssumedParityWD(pOld, pNew); - touched.push_back(vect->at(i)); - } - vectNew = &_current->_assumedParities[pNew]; - vectNew->insert(vectNew->end(), vect->begin(), vect->end()); - _current->_assumedParities.erase(it); - } - } -} - -void Rec2DData::revertAssumedParities() -{ - std::map<Rec2DVertex*, int>::iterator it; - it = _current->_oldParity.begin(); - for (; it != _current->_oldParity.end(); ++it) { - it->first->revertAssumedParity(it->second); - } -} - double Rec2DData::getGlobalQuality() { double a = (double)_current->_valVert / (double)_current->_numVert; @@ -1929,7 +1679,7 @@ void Rec2DTwoTri2Quad::_computeGlobQual() _globQualIfExecuted = Rec2DData::getGlobalQuality(4*REC2D_EDGE_QUAD - REC2D_EDGE_BASE, - valEdge, 0, valVert ); + valEdge, 0, _valVert ); _lastUpdate = Recombine2D::getNumChange(); } @@ -2078,16 +1828,6 @@ bool Rec2DTwoTri2Quad::isObsolete() const return Rec2DTwoTri2Quad::isObsolete(p); } -bool Rec2DTwoTri2Quad::isAssumedObsolete() const -{ - int p[4]; - p[0] = _vertices[0]->getAssumedParity(); - p[1] = _vertices[1]->getAssumedParity(); - p[2] = _vertices[2]->getAssumedParity(); - p[3] = _vertices[3]->getAssumedParity(); - return Rec2DTwoTri2Quad::isObsolete(p); -} - bool Rec2DTwoTri2Quad::isObsolete(const int *p) { if (p[0] && p[0]/2 == p[1]/2 && p[0]%2 != p[1]%2 || @@ -2098,53 +1838,6 @@ bool Rec2DTwoTri2Quad::isObsolete(const int *p) return false; } -void Rec2DTwoTri2Quad::getAssumedParities(int *par) const -{ - par[0] = _vertices[0]->getAssumedParity(); - par[1] = _vertices[1]->getAssumedParity(); - par[2] = _vertices[2]->getAssumedParity(); - par[3] = _vertices[3]->getAssumedParity(); -} - -bool Rec2DTwoTri2Quad::whatWouldYouDo - (std::map<Rec2DVertex*, std::vector<int> > &suggestions) -{ - int p[4]; - p[0] = _vertices[0]->getAssumedParity(); - p[1] = _vertices[1]->getAssumedParity(); - p[2] = _vertices[2]->getAssumedParity(); - p[3] = _vertices[3]->getAssumedParity(); - - if (Rec2DTwoTri2Quad::isObsolete(p)) { - return false; - } - - int min = 100, index = -1; - for (int i = 0; i < 4; ++i) { - if (p[i] && min > p[i]) { - min = p[i]; - index = i; - } - } - if (index == -1) { - Msg::Error("[Rec2DTwoTri2Quad] No parities ! That's not acceptable !"); - return false; - } - - for (int i = 0; i < 4; i += 2) { - int par; - if ((index/2)*2 == i) - par = min; - else - par = otherParity(min); - for (int j = 0; j < 2; ++j) { - if (p[i+j] != par) - suggestions[_vertices[i+j]].push_back(par); - } - } - return true; -} - void Rec2DTwoTri2Quad::getElements(std::vector<Rec2DElement*> &elem) const { elem.clear(); @@ -2448,16 +2141,6 @@ bool Rec2DCollapse::isObsolete() const _rec->_vertices[1]->getOnBoundary() ); } -bool Rec2DCollapse::isAssumedObsolete() const -{ - int p[2]; - p[0] = _rec->_vertices[0]->getAssumedParity(); - p[1] = _rec->_vertices[1]->getAssumedParity(); - return Rec2DCollapse::isObsolete(p) || - (_rec->_vertices[0]->getOnBoundary() && - _rec->_vertices[1]->getOnBoundary() ); -} - bool Rec2DCollapse::isObsolete(const int *p) { if (p[0] && p[0]/2 == p[1]/2 && p[0]%2 != p[1]%2) @@ -2465,12 +2148,6 @@ bool Rec2DCollapse::isObsolete(const int *p) return false; } -void Rec2DCollapse::getAssumedParities(int *par) const -{ - static int a = -1; - if (++a < 1) Msg::Error("FIXME Rec2DTwoTri2Quad::getAssumedParities not ok"); -} - bool Rec2DCollapse::whatWouldYouDo (std::map<Rec2DVertex*, std::vector<int> > &suggestions) { @@ -2703,7 +2380,7 @@ void Rec2DEdge::getActions(std::vector<Rec2DAction*> &actions) const /** Rec2DVertex **/ /*******************/ Rec2DVertex::Rec2DVertex(MVertex *v) -: _v(v), _angle(4.*M_PI), _onWhat(1), _parity(0), _assumedParity(0), +: _v(v), _angle(4.*M_PI), _onWhat(1), _parity(0), _lastUpdate(Recombine2D::getNumChange()), _sumQualAngle(.0) { reparamMeshVertexOnFace(_v, Recombine2D::getGFace(), _param); @@ -2717,7 +2394,7 @@ Rec2DVertex::Rec2DVertex(MVertex *v) Rec2DVertex::Rec2DVertex(Rec2DVertex *rv, double ang) : _v(rv->_v), _angle(ang), _onWhat(-1), _parity(rv->_parity), - _assumedParity(rv->_assumedParity), _lastUpdate(rv->_lastUpdate), + _lastUpdate(rv->_lastUpdate), _sumQualAngle(rv->_sumQualAngle), _edges(rv->_edges), _elements(rv->_elements), _param(rv->_param) { @@ -2745,8 +2422,6 @@ void Rec2DVertex::hide() Msg::Error("[Rec2DVertex] I have %d elements and %d edges", _elements.size(), _edges.size()); if (_parity) Rec2DData::removeParity(this, _parity); - if (_assumedParity) - Rec2DData::removeAssumedParity(this, _assumedParity); Rec2DData::remove(this); if (_elements.size()) { @@ -2759,8 +2434,6 @@ void Rec2DVertex::reveal() { if (_parity) Rec2DData::addParity(this, _parity); - if (_assumedParity) - Rec2DData::addAssumedParity(this, _assumedParity); Rec2DData::add(this); if (_elements.size()) @@ -2880,12 +2553,8 @@ void Rec2DVertex::setParity(int p, bool tree) //Msg::Warning("[Rec2DVertex] I don't like to do it. Think about that !"); Rec2DData::removeParity(this, _parity); } - _parity = p; - if (_assumedParity) { - Rec2DData::removeAssumedParity(this, _assumedParity); - _assumedParity = 0; - } - if (_parity) + + if ((_parity = p)) Rec2DData::addParity(this, _parity); #ifdef REC2D_DRAW if (_v) @@ -2902,10 +2571,7 @@ void Rec2DVertex::setParityWD(int pOld, int pNew) if (pOld != _parity) Msg::Error("[Rec2DVertex] Old parity was not correct"); _parity = pNew; - if (_assumedParity) { - Rec2DData::removeAssumedParity(this, _assumedParity); - _assumedParity = 0; - } + #ifdef REC2D_DRAW if (_v) _v->setIndex(_parity); @@ -2913,66 +2579,6 @@ void Rec2DVertex::setParityWD(int pOld, int pNew) #endif } -int Rec2DVertex::getAssumedParity() const -{ - if (_assumedParity) - return _assumedParity; - return _parity; -} - -bool Rec2DVertex::setAssumedParity(int p) -{ - if (p == _assumedParity) { - //Msg::Warning("[Rec2DVertex] Already have this assumed parity"); - return false; - } - if (p == _parity) { - Msg::Warning("[Rec2DVertex] Parity already this value (%d, %d) -> %d", - _parity, _assumedParity, p); - return false; - } - Rec2DData::saveAssumedParity(this, _assumedParity); - if (_assumedParity) { - Rec2DData::removeAssumedParity(this, _assumedParity); - } - _assumedParity = p; - Rec2DData::addAssumedParity(this, _assumedParity); -#ifdef REC2D_DRAW - if (_v) - _v->setIndex(_assumedParity); - //_v->setIndex(_onWhat); -#endif - return true; -} - -void Rec2DVertex::setAssumedParityWD(int pOld, int pNew) -{ - static int a = -1; - if (++a < 1) - Msg::Warning("FIXME puis-je rendre fonction utilisable uniquement par recdata ?"); - if (pOld != _assumedParity) - Msg::Error("[Rec2DVertex] Old assumed parity was not correct"); - Rec2DData::saveAssumedParity(this, _assumedParity); - _assumedParity = pNew; -} - -void Rec2DVertex::revertAssumedParity(int p) -{ - if (p == _parity) { - if (_assumedParity) { - Rec2DData::removeAssumedParity(this, _assumedParity); - _assumedParity = 0; - } - } - else { - if (_assumedParity) { - Rec2DData::removeAssumedParity(this, _assumedParity); - } - _assumedParity = p; - Rec2DData::addAssumedParity(this, _assumedParity); - } -} - void Rec2DVertex::relocate(SPoint2 p) { /*static int a = -1; @@ -3459,24 +3065,6 @@ double Rec2DElement::getAngle(const Rec2DVertex *rv) const return ang; } -void Rec2DElement::getAssumedParities(int *p) const -{ - if (_numEdge == 4) { - Msg::Error("[Rec2DElement] Not implemented for quad"); - } - Rec2DVertex *v[3]; - v[0] = _edges[0]->getVertex(0); - v[1] = _edges[0]->getVertex(1); - if (_edges[1]->getVertex(0) == v[0] || - _edges[1]->getVertex(0) == v[1] ) - v[2] = _edges[1]->getVertex(1); - else - v[2] = _edges[1]->getVertex(0); - p[0] = v[0]->getAssumedParity(); - p[1] = v[1]->getAssumedParity(); - p[2] = v[2]->getAssumedParity(); -} - void Rec2DElement::getMoreEdges(std::vector<Rec2DEdge*> &edges) const { for (int i = 0; i < _numEdge; ++i) diff --git a/Mesh/meshGFaceRecombine.h b/Mesh/meshGFaceRecombine.h index 9516a41bdd4120c5e1f5d2516775d5ee246404b4..f217fdddaf69aa7e53df90539b45c3b4864a5967 100644 --- a/Mesh/meshGFaceRecombine.h +++ b/Mesh/meshGFaceRecombine.h @@ -84,8 +84,6 @@ class Recombine2D { double _geomAngle(const MVertex*, const std::vector<GEdge*>&, const std::vector<MElement*>&) const; - bool _remainAllQuad(const Rec2DAction *action) const; - bool _remainAllQuad(std::set<Rec2DElement*>&) const; }; class Rec2DData { @@ -105,7 +103,6 @@ class Rec2DData { std::vector<Rec2DDataChange*> _changes; std::map<int, std::vector<Rec2DVertex*> > _parities; - std::map<int, std::vector<Rec2DVertex*> > _assumedParities; std::map<Rec2DVertex*, int> _oldParity; public : @@ -208,15 +205,6 @@ class Rec2DData { _current->_parities[p].push_back((Rec2DVertex*)rv); } static void associateParity(int pOld, int pNew, Rec2DDataChange *rdc = NULL); - static void removeAssumedParity(const Rec2DVertex*, int); - static inline void addAssumedParity(const Rec2DVertex *rv, int p) { - _current->_assumedParities[p].push_back((Rec2DVertex*)rv); - } - static void saveAssumedParity(const Rec2DVertex*, int); - static void associateAssumedParity(int pOld, int pNew, - std::vector<Rec2DVertex*>&); - static inline void clearAssumedParities() {_current->_oldParity.clear();} - static void revertAssumedParities(); }; enum Rec2DChangeType { @@ -345,9 +333,6 @@ class Rec2DAction { virtual void apply(std::vector<Rec2DVertex*> &newPar) = 0; virtual void apply(Rec2DDataChange*) const = 0; virtual bool isObsolete() const = 0; - virtual bool isAssumedObsolete() const = 0; - virtual void getAssumedParities(int*) const = 0; - virtual bool whatWouldYouDo(std::map<Rec2DVertex*, std::vector<int> >&) = 0; virtual Rec2DVertex* getVertex(int) const = 0; virtual int getNumElement() = 0; virtual void getElements(std::vector<Rec2DElement*>&) const = 0; @@ -388,10 +373,7 @@ class Rec2DTwoTri2Quad : public Rec2DAction { virtual void apply(Rec2DDataChange*) const; virtual bool isObsolete() const; - virtual bool isAssumedObsolete() const; static bool isObsolete(const int*); - virtual void getAssumedParities(int*) const; - virtual bool whatWouldYouDo(std::map<Rec2DVertex*, std::vector<int> >&); virtual inline Rec2DVertex* getVertex(int i) const {return _vertices[i];} //- virtual inline int getNumElement() {return 2;} @@ -433,9 +415,7 @@ class Rec2DCollapse : public Rec2DAction { virtual void apply(Rec2DDataChange*) const; virtual bool isObsolete() const; - virtual bool isAssumedObsolete() const; static bool isObsolete(const int*); - virtual void getAssumedParities(int*) const; virtual bool whatWouldYouDo(std::map<Rec2DVertex*, std::vector<int> >&); virtual inline Rec2DVertex* getVertex(int i) const { @@ -522,7 +502,7 @@ class Rec2DVertex { MVertex *_v; const double _angle; int _onWhat; // _onWhat={-1:corner,0:edge,1:face} - int _parity, _assumedParity, _lastUpdate; + int _parity, _lastUpdate; double _sumQualAngle; std::vector<Rec2DEdge*> _edges; std::vector<Rec2DElement*> _elements; @@ -553,10 +533,6 @@ class Rec2DVertex { inline int getParity() const {return _parity;} void setParity(int, bool tree = false); void setParityWD(int pOld, int pNew); - int getAssumedParity() const; - bool setAssumedParity(int); - void setAssumedParityWD(int pOld, int pNew); - void revertAssumedParity(int); inline int getNumElements() const {return _elements.size();} inline void getEdges(std::vector<Rec2DEdge*> &v) const {v = _edges;} @@ -655,7 +631,6 @@ class Rec2DElement { inline Rec2DAction* getAction(int i) const {return _actions[i];} inline void getActions(std::vector<Rec2DAction*> &v) const {v = _actions;}; void getUniqueActions(std::vector<Rec2DAction*>&) const; - void getAssumedParities(int*) const; void getMoreEdges(std::vector<Rec2DEdge*>&) const; void getVertices(std::vector<Rec2DVertex*>&) const; void getMoreNeighbours(std::vector<Rec2DElement*>&) const;