diff --git a/Geo/GModelIO_GEO.cpp b/Geo/GModelIO_GEO.cpp index 754bef927e13e8ed5175e23e0ecab1f60e4808f8..b3fdeea8085710f556154158288b989e8915c28c 100644 --- a/Geo/GModelIO_GEO.cpp +++ b/Geo/GModelIO_GEO.cpp @@ -143,25 +143,30 @@ int GModel::importGEOInternals() } if(Tree_Nbr(_geo_internals->Curves)) { List_T *curves = Tree2List(_geo_internals->Curves); + + // generate all curves except compounds + for(int i = 0; i < List_Nbr(curves); i++){ Curve *c; List_Read(curves, i, &c); if(c->Num >= 0){ GEdge *e = getEdgeByTag(c->Num); if(!e && c->Typ == MSH_SEGM_COMPOUND){ - std::vector<GEdge*> comp; - for(unsigned int j = 0; j < c->compound.size(); j++){ - GEdge *ge = getEdgeByTag(c->compound[j]); - if(ge) comp.push_back(ge); - } - e = new GEdgeCompound(this, c->Num, comp); - e->meshAttributes.method = c->Method; - e->meshAttributes.nbPointsTransfinite = c->nbPointsTransfinite; - e->meshAttributes.typeTransfinite = c->typeTransfinite; - e->meshAttributes.coeffTransfinite = c->coeffTransfinite; - e->meshAttributes.extrude = c->Extrude; - e->meshAttributes.reverseMesh = c->ReverseMesh; - add(e); + Msg::Debug("Postpone creation of compound edge %d" + "until all others have been created",c->Num); + // std::vector<GEdge*> comp; + // for(unsigned int j = 0; j < c->compound.size(); j++){ + // GEdge *ge = getEdgeByTag(c->compound[j]); + // if(ge) comp.push_back(ge); + // } + // e = new GEdgeCompound(this, c->Num, comp); + // e->meshAttributes.method = c->Method; + // e->meshAttributes.nbPointsTransfinite = c->nbPointsTransfinite; + // e->meshAttributes.typeTransfinite = c->typeTransfinite; + // e->meshAttributes.coeffTransfinite = c->coeffTransfinite; + // e->meshAttributes.extrude = c->Extrude; + // e->meshAttributes.reverseMesh = c->ReverseMesh; + // add(e); } else if(!e && c->beg && c->end){ e = new gmshEdge(this, c, @@ -184,6 +189,50 @@ int GModel::importGEOInternals() } } } + + // now generate the compound curves + + for(int i = 0; i < List_Nbr(curves); i++){ + Curve *c; + List_Read(curves, i, &c); + if(c->Num >= 0){ + GEdge *e = getEdgeByTag(c->Num); + if(!e && c->Typ == MSH_SEGM_COMPOUND){ + std::vector<GEdge*> comp; + for(unsigned int j = 0; j < c->compound.size(); j++){ + GEdge *ge = getEdgeByTag(c->compound[j]); + if(ge) comp.push_back(ge); + } + e = new GEdgeCompound(this, c->Num, comp); + e->meshAttributes.method = c->Method; + e->meshAttributes.nbPointsTransfinite = c->nbPointsTransfinite; + e->meshAttributes.typeTransfinite = c->typeTransfinite; + e->meshAttributes.coeffTransfinite = c->coeffTransfinite; + e->meshAttributes.extrude = c->Extrude; + e->meshAttributes.reverseMesh = c->ReverseMesh; + add(e); + } + // else if(!e && c->beg && c->end){ + // e = new gmshEdge(this, c, + // getVertexByTag(c->beg->Num), + // getVertexByTag(c->end->Num)); + // add(e); + // } + // else if(!e){ + // e = new gmshEdge(this, c, 0, 0); + // add(e); + // } + // else{ + // e->resetMeshAttributes(); + // } + + if(!c->Visible) e->setVisibility(0); + if(c->Color.type) e->setColor(c->Color.mesh); + if(c->degenerated) { + e->setTooSmall(true); + } + } + } List_Delete(curves); } if(Tree_Nbr(_geo_internals->Surfaces)) { diff --git a/Geo/Geo.cpp b/Geo/Geo.cpp index eddc492417d89c3b78a61aafbd148c7bbdd51a8d..47c91e1d186e79d4093914dd23b13cb14387a523 100644 --- a/Geo/Geo.cpp +++ b/Geo/Geo.cpp @@ -427,6 +427,61 @@ void End_Curve(Curve *c) } } + + if (c->Typ == MSH_SEGM_COMPOUND) { + + std::list<Curve*> tmp; + for (std::vector<int>::const_iterator cIter=c->compound.begin(); + cIter!=c->compound.end();++cIter) { + Curve* comp = FindCurve(*cIter); + if (!comp) Msg::Error("Could not find curve %d as part of compound edge %d",*cIter,c->Num); + tmp.push_back(comp); + } + + std::list<int> ordered; + + Curve* c0 = *(tmp.begin()); + tmp.pop_front(); + + ordered.push_back(c0->Num); + std::pair<Vertex*,Vertex*> vtcs(c0->beg,c0->end); + + while (tmp.size() != 0) { + unsigned nbCurrent = tmp.size(); + for (std::list<Curve*>::iterator tIter=tmp.begin();tIter!=tmp.end();tIter++) { + Curve* c1 = *tIter; + if (c1->beg == vtcs.first) { + vtcs.first = c1->end; + ordered.push_front(c1->Num); + tmp.erase(tIter); + break; + } + if (c1->end == vtcs.first) { + vtcs.first = c1->beg; + ordered.push_front(c1->Num); + tmp.erase(tIter); + break; + } + if (c1->beg == vtcs.second) { + vtcs.second = c1->end; + ordered.push_back(c1->Num); + tmp.erase(tIter); + break; + } + if (c1->end == vtcs.second) { + vtcs.second = c1->beg; + ordered.push_back(c1->Num); + tmp.erase(tIter); + break; + } + } + if (tmp.size() == nbCurrent) Msg::Error("Could not order compound edge %d to find begin and end vertex", c->Num); + } + c->beg = vtcs.first; + c->end = vtcs.second; + c->compound.clear(); + c->compound.insert(c->compound.end(),ordered.begin(),ordered.end()); + } } void End_Surface(Surface *s) @@ -1552,6 +1607,10 @@ Curve *CreateReversedCurve(Curve *c) newc->k[c->degre + List_Nbr(c->Control_Points) - i] = c->k[i]; } + if(c->Typ == MSH_SEGM_COMPOUND) { + newc->compound.insert(newc->compound.end(),c->compound.rbegin(),c->compound.rend()); + } + if(c->Typ == MSH_SEGM_CIRC) newc->Typ = MSH_SEGM_CIRC_INV; if(c->Typ == MSH_SEGM_CIRC_INV)