- for (i=aNb; i>0; --i) {
- const TopoDS_Shape& aVPrev=aVertVa(i);
- const gp_Pnt2d& aPaPrev=aCoordVa(i);
- const TopoDS_Shape& aEPrev=aLS(i);
-
- aBuf.Append(aEPrev);
-
- anIsSameV=aVPrev.IsSame(aVb);
- anIsSameV2d=Standard_False;
-
- if (anIsSameV) {
- anIsSameV2d = Standard_True;
+ aTol=2.*Tolerance2D(aVb, aGAS);
+ aTol2=10.*aTol*aTol;
+
+ TopoDS_Vertex aV1, aV2;
+ TopExp::Vertices(aEOuta, aV1, aV2);
+ Standard_Boolean bIsClosedEdge = aV1.IsNull() || aV2.IsNull() || aV1.IsSame(aV2);
+ Standard_Boolean bIsDegenerated = BRep_Tool::Degenerated(aEOuta);
+ Standard_Boolean bIsSeam = BRep_Tool::IsClosed(aEOuta, myFace);
+
+ anIt.Initialize(aLEInfoVb);
+ for (; anIt.More(); anIt.Next()) {
+ const BOPAlgo_EdgeInfo& anEI = anIt.Value();
+ const TopoDS_Edge& aE = anEI.Edge();
+ bIsDegenerated = bIsDegenerated || BRep_Tool::Degenerated(aE);
+ bIsSeam = bIsSeam || BRep_Tool::IsClosed(aE, myFace);
+ aV1.Nullify();
+ aV2.Nullify();
+ TopExp::Vertices(aE, aV1, aV2);
+ bIsClosedEdge = bIsClosedEdge || aV1.IsNull() || aV2.IsNull() || aV1.IsSame(aV2);
+ }
+ //
+ aNb=aLS.Length();
+ if (aNb>0) {
+ //
+ BOPCol_ListOfShape aBuf;
+ //
+ for (i=aNb; i>0; --i) {
+ const TopoDS_Shape& aVPrev=aVertVa(i);
+ const gp_Pnt2d& aPaPrev=aCoordVa(i);
+ const TopoDS_Shape& aEPrev=aLS(i);
+
+ aBuf.Append(aEPrev);
+
+ anIsSameV=aVPrev.IsSame(aVb);
+ anIsSameV2d=Standard_False;
+
+ if (anIsSameV) {
+ anIsSameV2d = Standard_True;
+ //
+ aD2=aPaPrev.SquareDistance(aPb);
+ anIsSameV2d =aD2<aTol2;
+ if(anIsSameV2d &&
+ (bIsDegenerated || bIsSeam || bIsClosedEdge)) {
+ Standard_Real udist = fabs(aPaPrev.X() - aPb.X());
+ Standard_Real vdist = fabs(aPaPrev.Y() - aPb.Y());
+ Standard_Real aTolU = 2. * UTolerance2D(aVb, aGAS);
+ Standard_Real aTolV = 2. * VTolerance2D(aVb, aGAS);
+ //
+ if((udist > aTolU) ||
+ (vdist > aTolV)) {
+ anIsSameV2d = Standard_False;
+ }
+ }
+ }//if (anIsSameV) {