diff --git a/Geo/GEdgeLoop.cpp b/Geo/GEdgeLoop.cpp index 92dd403eaab6b6244d5ee4049a7925e653b6d6df..4051bbd54791c9a30ec20dcac54b9febca5973e3 100644 --- a/Geo/GEdgeLoop.cpp +++ b/Geo/GEdgeLoop.cpp @@ -60,7 +60,7 @@ GEdgeSigned nextOne(GEdgeSigned *thisOne, std::list<GEdge*> &wire) GVertex *v2 = ge->getEndVertex(); if(v1 == gv) return GEdgeSigned(1, ge); if(v2 == gv) return GEdgeSigned(-1, ge); - Msg::Error("Something wrong in edge loop"); + Msg::Error("Something wrong in edge loop 1"); thisOne->print(); } ++it; @@ -77,7 +77,7 @@ GEdgeSigned nextOne(GEdgeSigned *thisOne, std::list<GEdge*> &wire) GVertex *v2 = ge->getEndVertex(); if(v1 == gv) return GEdgeSigned(1, ge); if(v2 == gv) return GEdgeSigned(-1, ge); - Msg::Error("Something wrong in edge loop"); + Msg::Error("Something wrong in edge loop 2"); thisOne->print(); } ++it; @@ -99,6 +99,38 @@ int GEdgeLoop::count(GEdge* ge) const return count; } +static void loopTheLoop(std::list<GEdge*> &wire, + std::list<GEdgeSigned> &loop, + GEdge **degeneratedToInsert) +{ + GEdgeSigned *prevOne = 0; + GEdgeSigned ges(0,0); + + while(wire.size()){ + if (prevOne && (*degeneratedToInsert) && + (*degeneratedToInsert)->getBeginVertex () == prevOne->getEndVertex()){ + ges = GEdgeSigned(1,*degeneratedToInsert); + *degeneratedToInsert = 0; + // printf("second degenerated edge inserted\n"); + } + else ges = nextOne(prevOne, wire); + if(ges.getSign() == 0){ // oops + if (0){ + Msg::Error("Something wrong in edge loop of size=%d, no sign !", wire.size()); + for (std::list<GEdge* >::iterator it = wire.begin(); it != wire.end(); it++){ + Msg::Error("GEdge=%d begin=%d end =%d", (*it)->tag(), + (*it)->getBeginVertex()->tag(), (*it)->getEndVertex()->tag()); + } + } + break; + } + prevOne = ⩾ + // ges.print(); + loop.push_back(ges); + } +} + + GEdgeLoop::GEdgeLoop(const std::list<GEdge*> &cwire) { // Sometimes OCC puts a nasty degenerated edge in the middle of the @@ -112,7 +144,7 @@ GEdgeLoop::GEdgeLoop(const std::list<GEdge*> &cwire) if (ed->degenerate(0))degenerated.push_back(ed); else wire.push_back(ed); } - + if (degenerated.size() == 1){ wire.push_front(degenerated[0]); } @@ -124,27 +156,9 @@ GEdgeLoop::GEdgeLoop(const std::list<GEdge*> &cwire) Msg::Error("More than two degenerated edges in one model face"); } - GEdgeSigned *prevOne = 0; - GEdgeSigned ges(0,0); - - while(wire.size()){ - if (prevOne && degeneratedToInsert && - degeneratedToInsert->getBeginVertex () == prevOne->getEndVertex()){ - ges = GEdgeSigned(1,degeneratedToInsert); - degeneratedToInsert = 0; - // printf("second degenerated edge inserted\n"); - } - else ges = nextOne(prevOne, wire); - if(ges.getSign() == 0){ // oops - Msg::Error("Something wrong in edge loop of size=%d, no sign !", wire.size()); - for (std::list<GEdge* >::iterator it = wire.begin(); it != wire.end(); it++){ - Msg::Error("GEdge=%d begin=%d end =%d", (*it)->tag(), - (*it)->getBeginVertex()->tag(), (*it)->getEndVertex()->tag()); - } - break; - } - prevOne = ⩾ - // ges.print(); - loop.push_back(ges); + while (!wire.empty()){ + printf("wire.size = %d\n",wire.size()); + loopTheLoop(wire,loop,°eneratedToInsert); + // break; } } diff --git a/benchmarks/2d/coin.geo b/benchmarks/2d/coin.geo index 02b9e3aaedda1a29a81252490596d90e82178e40..18a41ebe53a9f3eec72d086d7e0956b04cf693b2 100644 --- a/benchmarks/2d/coin.geo +++ b/benchmarks/2d/coin.geo @@ -1,10 +1,11 @@ +Mesh.SmoothRatio=21.5; lc = 0.1; a = 1.0; b = 1.0; h = 1.0; -refine = 0.0000001; +refine = 0.00001; Point(1) = {0, 0, 0, lc*refine}; Point(2) = {a, 0, 0, lc} ;