// File: IntPatch_ALine.cxx // Created: Mon Apr 6 11:17:45 1992 // Author: Jacques GOUSSARD // Copyright: OPEN CASCADE 1992 #include #define DEBUG 0 IntPatch_ALine::IntPatch_ALine (const IntAna_Curve& C, const Standard_Boolean Tang, const IntSurf_TypeTrans Trans1, const IntSurf_TypeTrans Trans2) : IntPatch_Line(Tang,Trans1,Trans2), fipt(Standard_False),lapt(Standard_False) { typ = IntPatch_Analytic; curv = C; } IntPatch_ALine::IntPatch_ALine (const IntAna_Curve& C, const Standard_Boolean Tang, const IntSurf_Situation Situ1, const IntSurf_Situation Situ2) : IntPatch_Line(Tang,Situ1,Situ2), fipt(Standard_False),lapt(Standard_False) { typ = IntPatch_Analytic; curv = C; } IntPatch_ALine::IntPatch_ALine (const IntAna_Curve& C, const Standard_Boolean Tang) : IntPatch_Line(Tang), fipt(Standard_False),lapt(Standard_False) { typ = IntPatch_Analytic; curv = C; } const IntAna_Curve& IntPatch_ALine::Curve() const { return(curv); } #define PCONFUSION 0.00001 void IntPatch_ALine::AddVertex (const IntPatch_Point& VTXj) { #if 0 Standard_Integer n = NbVertex(); if(n>=1) { Standard_Real par = VTXj.ParameterOnLine(); for(int i=1; i<=n ;i++) { const IntPatch_Point& VTXi = svtx.Value(i); if((VTXj.IsOnDomS1()==Standard_False) && (VTXj.IsOnDomS2()==Standard_False)) { if((VTXi.IsOnDomS1()==Standard_False) && (VTXi.IsOnDomS2()==Standard_False)) { if(Abs(par-VTXi.ParameterOnLine())<=PCONFUSION) { #if DEBUG cout<<" Rejet IntPatch_ALine::AddVertex (0) "< RIEN "<= ParamMinOnLine) { gp_Pnt P1 = Value(pmpimpi); Standard_Real d1 = P1.Distance(VTX.Value()); if(d1 svtx.Value(i).ParameterOnLine()) { SortIsOK = Standard_False; svtx.Exchange(i-1,i); if(fipt) { if(indf==i) indf=i-1; else if(indf==i-1) indf=i; } if(lapt) { if(indl==i) indl=i-1; else if(indl==i-1) indl=i; } } } } while(!SortIsOK); do { APointDeleted = Standard_False; for(i=1; (i<=nbvtx) && (APointDeleted==Standard_False) ;i++) { const IntPatch_Point& VTXi = svtx.Value(i); if((VTXi.IsOnDomS1()==Standard_True) && (VTXi.IsOnDomS2()==Standard_False)) { for(j=1; (j<=nbvtx) && (APointDeleted==Standard_False) ;j++) { if(i!=j) { const IntPatch_Point& VTXj = svtx.Value(j); if((VTXj.IsOnDomS1()==Standard_True) && (VTXj.IsOnDomS2()==Standard_False)) { if(Abs(VTXi.ParameterOnArc1()-VTXj.ParameterOnArc1())<=PCONFUSION) { if(Abs(VTXi.ParameterOnLine()-VTXj.ParameterOnLine())<=PCONFUSION) { if(VTXi.ArcOnS1() == VTXj.ArcOnS1()) { svtx.Remove(j); nbvtx--; if(lapt) { if(indl>=j) indl--; } if(fipt) { if(indf>=j) indf--; } APointDeleted = Standard_True; } } } } } } } } } while(APointDeleted == Standard_True); do { APointDeleted = Standard_False; for(i=1; (i<=nbvtx) && (APointDeleted==Standard_False) ;i++) { const IntPatch_Point& VTXi = svtx.Value(i); if((VTXi.IsOnDomS2()==Standard_True) && (VTXi.IsOnDomS1()==Standard_False)) { for(j=1; (j<=nbvtx) && (APointDeleted==Standard_False) ;j++) { if(i!=j) { const IntPatch_Point& VTXj = svtx.Value(j); if((VTXj.IsOnDomS2()==Standard_True) && (VTXj.IsOnDomS1()==Standard_False)) { if(Abs(VTXi.ParameterOnArc2()-VTXj.ParameterOnArc2())<=PCONFUSION) { if(Abs(VTXi.ParameterOnLine()-VTXj.ParameterOnLine())<=PCONFUSION) { if(VTXi.ArcOnS2() == VTXj.ArcOnS2()) { svtx.Remove(j); nbvtx--; if(lapt) { if(indl>=j) indl--; } if(fipt) { if(indf>=j) indf--; } APointDeleted = Standard_True; } } } } } } } } } while(APointDeleted == Standard_True); //---------------------------------------------------------- //-- Tri des vertex et suppression des Vtx superflus //-- do { nbvtx = NbVertex(); if(SortAgain) { do { SortIsOK = Standard_True; for(i=2; i<=nbvtx; i++) { if(svtx.Value(i-1).ParameterOnLine() > svtx.Value(i).ParameterOnLine()) { SortIsOK = Standard_False; svtx.Exchange(i-1,i); if(fipt) { if(indf==i) indf=i-1; else if(indf==i-1) indf=i; } if(lapt) { if(indl==i) indl=i-1; else if(indl==i-1) indl=i; } } } } while(!SortIsOK); } SortAgain = Standard_False; SortIsOK = Standard_True; for(i=2; i<=nbvtx && SortIsOK; i++) { IntPatch_Point& VTX = svtx.ChangeValue(i); for(j=1; ji) indl--; else if(indl==i) indl=j; } if(fipt) { if(indf>i) indf--; else if(indf==i) indf=j; } svtx.Remove(i); nbvtx--; } else if(killm1) { SortIsOK = Standard_False; if(lapt) { if(indl>j) indl--; else if(indl==j) indl=i-1;} if(fipt) { if(indf>j) indf--; else if(indf==j) indf=i-1;} svtx.Remove(j); nbvtx--; } } } } } while(!SortIsOK); //---------------------------------------------------------- //-- Traitement des lignes periodiques -- //---------------------------------------------------------- if(OpenFirst == Standard_False && OpenLast == Standard_False) { nbvtx = NbVertex(); IntPatch_Point& VTX0 = svtx.ChangeValue(1); IntPatch_Point& VTXN = svtx.ChangeValue(nbvtx); if(VTX0.ParameterOnLine() == ParamMinOnLine) { if(VTXN.ParameterOnLine() !=ParamMaxOnLine) { gp_Pnt PN=Value(ParamMaxOnLine); Standard_Real d = PN.Distance(VTX0.Value()); if(d<=Tol) { IntPatch_Point OVTX(VTX0); OVTX.SetParameter(ParamMaxOnLine); svtx.Append(OVTX); } } else { if(VTXN.ParameterOnLine() == ParamMaxOnLine) { if(VTX0.ParameterOnLine() !=ParamMinOnLine) { gp_Pnt P0=Value(ParamMinOnLine); Standard_Real d = P0.Distance(VTX0.Value()); if(d<=Tol) { IntPatch_Point OVTX(VTXN); OVTX.SetParameter(ParamMinOnLine); svtx.Prepend(OVTX); } } } } } } //--------------------------------------------------------- //-- Faut il supprimer le premier et le dernier point //-- nbvtx = NbVertex(); if(nbvtx>1) { IntPatch_Point& VTX0 = svtx.ChangeValue(1); svtx.ChangeValue(2); if( (VTX0.IsOnDomS1() == Standard_False) && (VTX0.IsOnDomS2() == Standard_False)) { svtx.Remove(1); nbvtx--; if(lapt) { indl--; } } } if(nbvtx>1) { IntPatch_Point& VTX0 = svtx.ChangeValue(nbvtx); svtx.ChangeValue(nbvtx-1); if( (VTX0.IsOnDomS1() == Standard_False) && (VTX0.IsOnDomS2() == Standard_False)) { svtx.Remove(nbvtx); #ifndef DEB if((signed)lapt == nbvtx) { #else if(lapt == nbvtx) { #endif indl--; } } } //-- Si 2 vertex ont le meme parametre on identifie le p3d nbvtx = NbVertex(); do { SortIsOK = Standard_True; for(i=2; i<=nbvtx; i++) { IntPatch_Point& VTX = svtx.ChangeValue(i); IntPatch_Point& VTXm1 = svtx.ChangeValue(i-1); if(Abs(VTX.ParameterOnLine()-VTXm1.ParameterOnLine()) 1e-12) { IntPatch_Point CopyVtx = VTXm1; VTXm1.SetParameter(VTX.ParameterOnLine()); VTXm1.SetValue(VTX.Value(),VTX.Tolerance(),VTX.IsTangencyPoint()); Standard_Real u1,v1,u2,v2; VTX.Parameters(u1,v1,u2,v2); VTXm1.SetParameters(u1,v1,u2,v2); if(CopyVtx.IsOnDomS1()) { VTXm1.SetArc(Standard_True, CopyVtx.ArcOnS1(), CopyVtx.ParameterOnArc1(), CopyVtx.TransitionLineArc1(), CopyVtx.TransitionOnS1()); } if(CopyVtx.IsOnDomS2()) { VTXm1.SetArc(Standard_False, CopyVtx.ArcOnS2(), CopyVtx.ParameterOnArc2(), CopyVtx.TransitionLineArc2(), CopyVtx.TransitionOnS2()); } if(CopyVtx.IsVertexOnS1()) { VTXm1.SetVertex(Standard_True,CopyVtx.VertexOnS1()); VTXm1.SetArc(Standard_True, CopyVtx.ArcOnS1(), CopyVtx.ParameterOnArc1(), CopyVtx.TransitionLineArc1(), CopyVtx.TransitionOnS1()); } if(CopyVtx.IsVertexOnS2()) { VTXm1.SetVertex(Standard_False,CopyVtx.VertexOnS2()); VTXm1.SetArc(Standard_False, CopyVtx.ArcOnS2(), CopyVtx.ParameterOnArc2(), CopyVtx.TransitionLineArc2(), CopyVtx.TransitionOnS2()); } SortIsOK=Standard_False; //-- cout<<" IntPatch_ALine : ComputeVertexParameters : Ajust "<